Отображение вложенного списка с помощью списка в Python? - PullRequest
9 голосов
/ 20 августа 2009

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

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

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

Ответы [ 5 ]

14 голосов
/ 20 августа 2009

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

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

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

3 голосов
/ 15 марта 2013

Помните Дзен Питона:

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

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

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

from functools import partial
nested_list = map( partial(map, str.upper), nested_list )
3 голосов
/ 20 августа 2009

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

[[ix.upper() for ix in x] for x in nested_list]
2 голосов
/ 01 октября 2014

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

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, не стесняйтесь обсуждать!

0 голосов
/ 21 августа 2009

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

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 могут быть более очевидными для других.

...