Сопоставление вложенного списка с помощью List Comprehension в Python?

StackOverflow https://stackoverflow.com/questions/1306670

Вопрос

У меня есть следующий код, который я использую для сопоставления вложенного списка в Python для создания списка с той же структурой.

>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]

Можно ли это сделать только с помощью понимания списка (без использования функции карты)?

Это было полезно?

Решение

Для вложенных списков вы можете использовать вложенные списки:

nested_list = [[s.upper() for s in xs] for xs in nested_list]

Лично я нахожу map чтобы быть чище в этой ситуации, хотя я почти всегда предпочитаю понимание списка.Так что это действительно ваш выбор, поскольку подойдет любой вариант.

Другие советы

Помните дзен Python:

Обычно их больше одного – и, вероятно, несколько -- очевидные способы сделать это.**

** Примечание:Отредактировано для точности.

В любом случае, я предпочитаю карту.

from functools import partial
nested_list = map( partial(map, str.upper), nested_list )

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

[[ix.upper() for ix in x] for x in nested_list]

Вот решение для вложенный список произвольной глубины:

def map_nlist(nlist=nlist,fun=lambda x: x*2):
    new_list=[]
    for i in range(len(nlist)):
        if isinstance(nlist[i],list):
            new_list += [map_nlist(nlist[i],fun)]
        else:
            new_list += [fun(nlist[i])]
    return new_list

вы хотите, чтобы все элементы списка были в верхнем регистре, просто введите

In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]]
In [27]: map_nlist(nested_list,fun=str.upper)
Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]]

И что еще более важно, эта рекурсивная функция может сделать больше!

Я новичок в Python, не стесняйтесь обсуждать!

Другие авторы дали ответ, но всякий раз, когда у меня возникают проблемы с пониманием функциональной конструкции, я проглатываю свою гордость и записываю ее от руки с явно неоптимальными методами и/или объектами.Вы сказали, что хотите получить генератор, поэтому:

for xs in n_l:
    def doUpper(l):
        for x in l:
            yield x.upper()
    yield doUpper(xs)

for xs in n_l:
    yield (x.upper() for x in xs)

((x.upper() for x in xs) for xs in n_l)

Иногда проще сохранить одну из рукописных версий.Для меня отображение и сокращение иногда делают это более очевидным, но идиомы Python могут быть более очевидными для других.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top