繁体   English   中英

使用列表理解生成字典列表的问题

[英]Issue with generating list of dictionary using list comprehension

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)

通过上面的列表理解,我可以生成字典列表。 如果feed值相同,则需要将这些值附加到id

电流输出:

[{'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']}]

使用itertools.groupby

例如:

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']}]

不使用lambda的解决方案,请注意,此解决方案的顺序与您的问题不同:

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']}]

我使用以下for循环从feed_mapping中拆分了键和值:

for feed_key, feed_value in feed_mapping.items()]

然后我有第二个(嵌套for循环,将x中的项目添加到id字段:

i for i in x

我注意到,仅当feed_mapping键位于i的字符串中时,您才想添加一个id,我在嵌套的for循环内使用以下if语句来执行此操作:

[i for i in x if feed_key in i]

您可以使用defaultdict将列表x转换为字典:

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']}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM