Отсортируйте многомерный список по переменному количеству ключей

Это не совсем корректно, чтобы сказать, что компилятор не может оптимизировать далеко копию временной переменной в постфиксном случае. Быстрый тест с VC показывает, что это, по крайней мере, может сделать это в определенных случаях.

В следующем примере, сгенерированный код идентичен для префикса и постфикса, например:

#include <stdio.h>

class Foo
{
public:

    Foo() { myData=0; }
    Foo(const Foo &rhs) { myData=rhs.myData; }

    const Foo& operator++()
    {
        this->myData++;
        return *this;
    }

    const Foo operator++(int)
    {
        Foo tmp(*this);
        this->myData++;
        return tmp;
    }

    int GetData() { return myData; }

private:

    int myData;
};

int main(int argc, char* argv[])
{
    Foo testFoo;

    int count;
    printf("Enter loop count: ");
    scanf("%d", &count);

    for(int i=0; i<count; i++)
    {
        testFoo++;
    }

    printf("Value: %d\n", testFoo.GetData());
}

, Делаете ли Вы ++ testFoo или testFoo ++, Вы все еще получите тот же получающийся код. На самом деле, не читая количество в от пользователя, оптимизатор снизил все это к константе. Так это:

for(int i=0; i<10; i++)
{
    testFoo++;
}

printf("Value: %d\n", testFoo.GetData());

Привел к следующему:

00401000  push        0Ah  
00401002  push        offset string "Value: %d\n" (402104h) 
00401007  call        dword ptr [__imp__printf (4020A0h)] 

Поэтому, в то время как, конечно, имеет место, что постфиксная версия могла быть медленнее, может случиться так, что оптимизатор будет достаточно хорош для избавлений от временной копии, если Вы не будете использовать его.

9
задан Community 23 May 2017 в 11:53
поделиться

4 ответа

import operator:
def sortByColumn(bigList, *args)
    bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place
11
ответ дан 4 December 2019 в 09:37
поделиться

Это будет отсортировано по столбцам 2 и 3:

a.sort(key=operator.itemgetter(2,3))
8
ответ дан 4 December 2019 в 09:37
поделиться

Ключевая идея здесь (каламбур) заключается в использовании ключевой функции, возвращающей кортеж. Ниже ключевой функцией является лямбда x: (x [idx] для idx в args) x устанавливается равным элементу aList, то есть строке данных. Он возвращает набор значений, а не только одно значение. Метод sort () сортирует в соответствии с первым элементом списка, затем прерывает связь со вторым и так далее. См. http://wiki.python.org/moin/HowTo/Sorting#Sortingbykeys

#!/usr/bin/env python
import csv
def sortByColumn(aList,*args):
    aList.sort(key=lambda x: (x[idx] for idx in args))
    return aList

filename='file.txt'
def convert_ints(astr):
    try:
        return int(astr)
    except ValueError:
        return astr    
biglist=[[convert_ints(elt) for elt in line]
         for line in csv.reader(open(filename,'r'),delimiter='\t')]

for row in sortByColumn(biglist,0):
    print row

for row in sortByColumn(biglist,2,3):
    print row
2
ответ дан 4 December 2019 в 09:37
поделиться

Убедитесь, что вы преобразовали числа в целые, иначе они будут отсортированы по алфавиту, а не по числовому.

# Sort the list in place
def sortByColumn(A,*args):
    import operator
    A.sort(key=operator.itemgetter(*args))
    return A

или

# Leave the original list alone and return a new sorted one
def sortByColumn(A,*args):
    import opertator
    return sorted(A,key=operator.itemgetter(*args))
1
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: