Выполнение объединения словаря элементов списка - PullRequest
0 голосов
/ 23 октября 2019

У меня есть словарь в форме dict [keyA] [key1], где 'key1' - это словарь списков. т.е. keyA - это словарь словарей списков. Ниже приведен пример создания словаря.

dict = { 'keyA': { 'keyA1': ['L1','L2',...], 'keyA2': ['L','L',...], ... },
         'keyB': { 'keyB1': ['L1','L2',...], 'key...': ['L','L',..], ...}
         }

Мне нужно объединить значения списков вместе, и я хотел бы сделать это с помощью такой конструкции:

newStr = ' A B C '.join(val for val in (dict[keyA][k] for k in dict[keyA]))

Это происходит с ошибкой, что val - это «список» вместо строки.

, когда я разрешаю val через 2 для циклов, я получаю список строк, как я ожидаю, что будет предоставлено выше.

Простой пример, который работает для одной записи во внешнем словаре и печатает список строк

for k in dict[keyA]:
    for val in dict[keyA][k]:
        print(val)

Пример, который не работает и печатает «список»:

for val in (dict[keyA][k] for k in dict[keyA]): print(val)

вывод из-за неудачного теста выше (обратите внимание на прилагаемые скобки в выходных данных). Если я «набираю» это значение, это означает, что значение действительно является списком: ['некоторый текст', 'еще немного текста', ....]

При работе над вложенными циклами 'for' вышеприведенный выше текст в отдельных строках без квадратных скобок, как и ожидалось, вывод которых должен работать в соединении, чтобы дать желаемые результаты ....

Может кто-нибудь объяснить, чего мне здесь не хватает

1 Ответ

1 голос
/ 23 октября 2019

Ваш синтаксис для «вложенного» понимания не совсем корректен.

Если вы выделите вторую часть, вы увидите, что ее вызывает:

>>> [_dict['keyA'][k] for k in _dict['keyA']]
[['L1', 'L2', 'L3'], ['Q1', 'Q2', 'Q3']]

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

В любом случае вам просто нужно настроить понимание:

>>> ' A B C '.join(val for key in _dict['keyA'] for val in _dict['keyA'][key])
'L1 A B C L2 A B C L3 A B C Q1 A B C Q2 A B C Q3'

Или используя dict.items:

(Примечание: _ используется какзаполнитель / выбрасывание здесь, так как в этом случае вам на самом деле не нужна переменная цикла «ключ»)

>>> ' A B C '.join(val for _, v in _dict['keyA'].items() for val in v)
'L1 A B C L2 A B C L3 A B C Q1 A B C Q2 A B C Q3'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...