Понимание списка во вложенных списках - PullRequest
2 голосов
/ 14 октября 2010

У меня есть список как [["foo", ["a", "b", "c"]], ["bar", ["a", "b", "f"]]]

и я хочу разделить его, чтобы я мог подсчитать общее количество As, B и т. Д., Но я новичок в Python и немного потратил время.

Я использую [lx for lx in [li[1] for li in fieldlist if li[1]]], чтобы попытаться получить список со всеми элементами в подсписках, но он возвращает список с первыми подсписками ([["a", "b", "c"], ["a", "b", "f"]] вместо списка с содержимым этих подсписков). Я уверен, что просто думаю об этом неправильно, так как я новичок в перечислении пониманий и Python.

У кого-нибудь есть хороший способ сделать это? (и да, я знаю, что имена, которые я выбрал (lx, li), ужасны)

Спасибо.

Ответы [ 3 ]

5 голосов
/ 14 октября 2010

Это даст вам список, который вы хотите:

[lx for li in fieldlist for lx in li[1] if li[1]]
0 голосов
/ 14 октября 2010

Pythonic решение будет что-то вроде:

>>> from collections import Counter
>>> Counter(v for (field, values) in fieldlist
...           for v in values)
Counter({'a': 2, 'b': 2, 'c': 1, 'f': 1})
0 голосов
/ 14 октября 2010

Понимание списка:

>>> s = [["foo", ["a", "b", "c"]], ["bar", ["a", "b", "f"]]]
>>> [x for y, z in s for x in z]
['a', 'b', 'c', 'a', 'b', 'f']
>>>

Какова цель вашего if li[1]?Если li[1] - пустой список или другой контейнер, проверка является избыточной.В противном случае вы должны отредактировать свой вопрос, чтобы объяснить, что еще это может быть.

...