Python: несоответствие в itemgetter () - PullRequest
0 голосов
/ 23 октября 2019

У меня была странная ошибка в моем коде, и она прослеживалась до следующего поведения itemgetter:

>>> from operator import itemgetter
>>> l = ['abc', 'def', 'ghi']
>>> index_list_1 = [0]
>>> index_list_2 = [0, 1]
>>> list(itemgetter(*index_list_1)(l))
['a', 'b', 'c']
>>> list(itemgetter(*index_list_2)(l))
['abc', 'def']

Вывод, который я хотел получить с помощью index_list_1, будет ['abc'], но если *У 1007 * есть только один элемент для извлечения, он возвращает элемент вместо одного кортежа.

Я неправильно использую itemgetter?

Как я могу убедиться, что яполучить одноэлементный список, если просто извлечь одно значение?

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Все выглядит хорошо: itemgetter(*[0])(['abc']) возвращает abc, и вы строите list из этого. list('abc') преобразует свои входные данные в list и возвращает ['a', 'b' 'c'].

0 голосов
/ 23 октября 2019

Один глупый способ решить проблему:

list(itemgetter(*l+[l[-1]])(m))[:-1]

... или

list(itemgetter(*l)(m)) if len(l) > 1 else [m[l[0]]]

, где l - это список значений для извлечения значений для m - это список значений.

Это не работает, если l - пустой список, но itemgetter также не может справиться с этим случаем, хотя непротиворечивое поведение будет возвращать ().

Поведение itemgetter очень неудачно.

Лучшим вариантом в этом случае может быть

[m[i] for i in l]
...