Python нарезки многоуровневого списка dict с использованием понимания списка - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть глубокий список на 3 уровня, как показано ниже:

parent = [
   [
      {'x': 1, 'y': 2},
      {'x': 3, 'y': 8},
      .
      .
      .
   ],
   [
      {'x': 8, 'y': 5},
      {'x': 9, 'y': 6},
      .
      .
      .
   ]
]

Я пытаюсь использовать понимание списка, чтобы получить все x в списке и все y в другом списке

Iпробовал что-то вроде этого: [gc для gc в [c для c в [p.get ('x') для p в родительском]]]

, но get ('x') все еще попадает в списоквместо элемента, в основном из-за самого внутреннего [].Есть идеи как этого добиться?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Список доступных вам списков может быть:

[ [c.get('x') for c in p] for p in parent]

Но это должно быть сведено, поэтому, возможно, вам следует сделать что-то вроде:

print reduce(
    lambda curr, acc: curr + acc, 
    [ [c.get('x') for c in p] for p in parent],
    []
)

Надеюсь, это поможет.

0 голосов
/ 13 декабря 2018

Вам не нужно перечислять здесь понимания.

Вот функциональное решение с помощью operator.itemgetter и itertools.chain:

from itertools import chain
from operator import itemgetter

parent = [[{'x': 1, 'y': 2},
           {'x': 3, 'y': 8}],
          [{'x': 8, 'y': 5},
           {'x': 9, 'y': 6}]]

x, y = zip(*map(itemgetter('x', 'y'), chain.from_iterable(parent)))

print(x)  # (1, 3, 8, 9)
print(y)  # (2, 8, 5, 6)

В качестве альтернативы вы можете использовать вложенные списки:

x = [i['x'] for L in parent for i in L]
y = [i['y'] for L in parent for i in L]

Обратите внимание, что порядок вложенных пониманий согласуется с обычным циклом for:

x = []
for L in parent:
    for i in L:
        x.append(i['x'])
...