Различия в структуре вложенных списков и вложенных словарей - PullRequest
0 голосов
/ 17 октября 2018

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

Пример:

alist = [[1,2,3],[4,5,6],[7,8,9]]

print([[[xi, index] for index, xi in enumerate(x) ] for x in alist])

print({xi: index for x in alist for index, xi in enumerate(x)})

[[[1, 0], [2, 1], [3, 2]], [[4, 0], [5, 1], [6, 2]], [[7, 0], [8, 1], [9, 2]]]
{1: 0, 2: 1, 3: 2, 4: 0, 5: 1, 6: 2, 7: 0, 8: 1, 9: 2}

Может кто-нибудь прояснить эту разницу в синтаксисе, или я здесь что-то не так делаю?

1 Ответ

0 голосов
/ 18 октября 2018

Возможно, было бы легче увидеть, расширили ли вы оба цикла, в первом случае вы увидите, что у вашего результата есть подсписки, которые добавляются в большой список, то есть создает внутренний слой блокировки в вашем понимании списка и должен бытьсопровождается его for index, xi in enumerate(x).Когда мы смотрим на нижнее диктитарное понимание, вы создаете плоский словарь, который добавляется к одному списку, поэтому в вашем словаре нет внутреннего блока

lst = []
for x in alist:
    new = []
    for index, xi in enumerate(x):
        new.append([xi, index])
    lst.append(new)

print(lst)
# [[[1, 0], [2, 1], [3, 2]], [[4, 0], [5, 1], [6, 2]], [[7, 0], [8, 1], [9, 2]]]


d = {}
for x in alist:
    for index, xi in enumerate(x):
        d[xi] = index
print(d)
# {1: 0, 2: 1, 3: 2, 4: 0, 5: 1, 6: 2, 7: 0, 8: 1, 9: 2}

Другой пример - создание вложенного словарного понимания.а также

print({alist.index(x):{xi:index for index, xi in enumerate(x)} for x in alist})
# {0: {1: 0, 2: 1, 3: 2}, 1: {4: 0, 5: 1, 6: 2}, 2: {7: 0, 8: 1, 9: 2}}
...