Проблема с созданием списка словаря с использованием понимания списка - PullRequest
1 голос
/ 25 марта 2019
feed_mapping = {'BC': 11, 'HA':12, 'AB':16,'GR':18}
x = ['AB-16007891', 'HA-4625798','GR-4444545','BC-4447764','HA-46257854']
feed = [{"feed": feed_mapping[i.split('-')[0]],"id":[i]} for i in x]
print(feed)

При таком понимании списка, я могу создать список словаря. Мне нужно добавить значения к id, если значение feed такое же

Токовый выход:

[{'feed': 16, 'id': ['AB-16007891']}, {'feed': 12, 'id': ['HA-4625798']}, {'feed': 18, 'id': ['GR-4444545']}, {'feed': 11, 'id': ['BC-4447764']}, {'feed': 12, 'id': ['HA-46257854']}]

Ожидаемый результат:

[{'feed': 16, 'id': ['AB-16007891']}, {'feed': 12, 'id': ['HA-4625798','HA-46257854']}, {'feed': 18, 'id': ['GR-4444545']}, {'feed': 11, 'id': ['BC-4447764']}]

Ответы [ 3 ]

5 голосов
/ 25 марта 2019

Использование itertools.groupby

Ex:

from itertools import groupby
feed_mapping = {'BC': 11, 'HA':12, 'AB':16,'GR':18}
x = ['AB-16007891', 'HA-4625798','GR-4444545','BC-4447764','HA-46257854']
x.sort()

feed = [{"feed": feed_mapping[k], "id": list(v)} for k, v in groupby(x, lambda x: x.split('-')[0])]
print(feed)

Выход:

[{'feed': 16, 'id': ['AB-16007891']},
 {'feed': 11, 'id': ['BC-4447764']},
 {'feed': 18, 'id': ['GR-4444545']},
 {'feed': 12, 'id': ['HA-46257854', 'HA-4625798']}]
1 голос
/ 25 марта 2019

Вы можете преобразовать список x в словарь, используя defaultdict:

from collections import defaultdict

feed_mapping = {'BC': 11, 'HA':12, 'AB':16,'GR':18}
x = ['AB-16007891', 'HA-4625798','GR-4444545','BC-4447764','HA-46257854']

x_ = defaultdict(list)
for i in x:
    key = i.split('-')[0]
    x_[key].append(i)

[{'feed': feed_mapping[k], 'id': v} for k, v in x_.items()]
# [{'feed': 16, 'id': ['AB-16007891']}, {'feed': 12, 'id': ['HA-4625798', 'HA-46257854']}, {'feed': 18, 'id': ['GR-4444545']}, {'feed': 11, 'id': ['BC-4447764']}]
1 голос
/ 25 марта 2019

Решение без использования лямбды, обратите внимание, что это решение не поддерживает тот же порядок, что и в вашем вопросе:

feed_mapping = {'BC': 11, 'HA': 12, 'AB': 16, 'GR': 18}
x = ['AB-16007891', 'HA-4625798', 'GR-4444545', 'BC-4447764', 'HA-46257854']
feed = [{"feed": feed_value, "id": [i for i in x if feed_key in i]} for
        feed_key, feed_value in feed_mapping.items()]
print(feed)

>>> [{'feed': 11, 'id': ['BC-4447764']}, {'feed': 12, 'id': ['HA-4625798', 'HA-46257854']}, {'feed': 16, 'id': ['AB-16007891']}, {'feed': 18, 'id': ['GR-4444545']}]

Я разделил ваш ключ и значение из feed_mapping, используя следующий цикл for:

for feed_key, feed_value in feed_mapping.items()]

Затем у меня есть секунда (вложенная в цикл для добавления элементов в x в поле id:

i for i in x

Я заметил, что вы хотите добавить идентификатор только в том случае, если ключ feed_mapping находится в строке i, что я делаю с помощью следующего оператора if внутри вложенного цикла for:

[i for i in x if feed_key in i]
...