Python: Как использовать понимание списка здесь? - PullRequest
4 голосов
/ 02 февраля 2011

У меня есть данные следующей формы:

foos = [{'bar': [{'baz': 1}, {'baz': 2}]}, {'bar': [{'baz': 3}, {'baz': 4}]}, {'bar': [{'baz': 5}, {'baz': 6}]}]

Мне нужно понимание списка, которое даст:

[1, 2, 3, 4, 5, 6]

Я не совсем уверен, как это сделать. Эта Сорта работает:

>>> [[bar['baz'] for bar in foo['bar']] for foo in foos]
[[1, 2], [3, 4], [5, 6]]

но я хочу, чтобы результаты были сплющенными.

Ответы [ 3 ]

10 голосов
/ 02 февраля 2011

Вместо вложенных списочных пониманий вы можете сделать это с двумя for .. in предложениями в одном понимании списка:

In [19]: [item['baz'] for foo in foos for item in foo['bar']]
Out[19]: [1, 2, 3, 4, 5, 6]

Обратите внимание, что

[... for foo in foos for item in foo['bar']]

примерно переводится в

for foo in foos:
    for item in foo['bar']:
        ...
4 голосов
/ 02 февраля 2011

это подойдет

 [y['baz'] for x in foos for y in x['bar']]

Если вы считаете, что это не совсем естественно, я согласен.

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

0 голосов
/ 03 февраля 2011
foos = [{'bar': [{'baz': 1}, {'baz': 2}]}, {'bar': [{'baz': 3}, {'baz': 4}]}, {'bar': [{'baz': 5}, {'baz': 6}]}]

for x in foos:
  for y in x:

    for i in range(len(x[y])):
      for z in x[y][i]:
        print x[y][i][z]
...