我创建了2个列表,并为每个项目添加了递增值。原因是每个列表中的值将在字典中连接在一起。但是,每个列表中的值不是1对1对。这就是为什么我添加了递增值以帮助将每个键与其对应的值相关联。
以下是我列表中的一些示例数据:
list_a = ['abc|1','bcd|2','cde|3']
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3']
理想情况下,我要做的是运行两个列表,然后根据递增值生成基于配对的字典。我猜测适用的值必须是一个列表?
以下是理想的输出:
my_dict = {'abc|1':'1234|1','bcd|2':['2345|2','3456|2','4567|2'],'cde|3':'5678|3'}
任何帮助将不胜感激, 在此先感谢:)
答案 0 :(得分:2)
您可以使用第一个分组进行两个分组:
list_a = ['abc|1','bcd|2','cde|3']
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3']
d = defaultdict(list)
from itertools import chain
for k in chain(list_a,list_b):
d[k.rsplit("|",1)[1]].append(k)
print(d)
print({v[0]:v[1:] for v in d.values()})
defaultdict(<type 'list'>, {'1': ['abc|1', '1234|1'], '3': ['cde|3', '5678|3'], '2': ['bcd|2', '2345|2', '3456|2', '4567|2']})
{'abc|1': ['1234|1'], 'cde|3': ['5678|3'], 'bcd|2': ['2345|2', '3456|2', '4567|2']}
如果需要,可以先通过检查长度来避免单个值的列表。
d = {v[0]: (v[1:] if len(v)> 2 else v[-1]) for v in d.values()}
print(d)
{'abc|1': '1234|1', 'cde|3': '5678|3', 'bcd|2': ['2345|2', '3456|2', '4567|2']}
使用python3使用extended iterable unpacking语法更好一些:
d = {k: (val if len(val) > 1 else val[0]) for k,*val in d.values()}
print(d)
如果您想根据lista中的键进行订购,您需要一个OrderedDict:
list_a = ['abc|1', 'bcd|2', 'cde|3']
list_b = ['1234|1', '2345|2', '3456|2', '4567|2', '5678|3']
from collections import OrderedDict
from itertools import chain
od = OrderedDict()
for k in chain(list_a, list_b):
od.setdefault(k.rsplit("|",1)[1], []).append(k)
d = OrderedDict((k, (val)) for k, *val in od.values())
答案 1 :(得分:2)
可以通过类似的东西来实现
temp_dict = {}
for x in list_a:
val = x.split('|')[1]
temp_dict[x] = [y for y in list_b if y.endswith("|" + val)]
答案 2 :(得分:2)
list_a = ['abc|1','bcd|2','cde|3']
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3']
tmp = {k.split('|')[1]: (k, []) for k in list_a}
for v in list_b:
tmp[v.split('|')[1]][1].append(v)
my_dict = dict(tmp.values())
这会让关闭到您发布的目标,但我认为它实际上更好。
goal: {'abc|1': '1234|1', 'bcd|2': ['2345|2', '3456|2', '4567|2'], 'cde|3': '5678|3' }
mine: {'abc|1': ['1234|1'], 'bcd|2': ['2345|2', '3456|2', '4567|2'], 'cde|3': ['5678|3']}
你可以看到我们只是将单身人士列入(我)或不(你)。我认为我的方式更好的原因是因为任何代码使用这个结果可能会更容易,如果所有值都是列表,所以它不需要处理两个单个字符串和字符串列表。就像我更容易生成列表一样。
但如果您仍然喜欢自己的方式,请将我的上一行更改为:
my_dict = {k: v if len(v) > 1 else v[0] for k, v in tmp.values()}
答案 3 :(得分:0)
这是一个非常易读的代码,它应该足够清楚,但如果您对此有疑问,请发表评论。如果要在键添加到字典时保持键的顺序,可以使用OrderedDict而不是普通的dict()。
list_a = ['abc|1','bcd|2','cde|3']
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3']
d = dict()
for item in list_a:
d.update({item:[]}) # initialize the dictionary
value_a = item.split('|')[1] # extract the number from the item of list_a
for thing in list_b:
value_b = thing.split('|')[1] # extract the number from the item of list_b
if value_a == value_b: # if the numbers are the same
d[item].append(thing) # append the item of list_b into the dictionary
print(d)