Python- 根据 2 个列表中的增量值添加到字典

Python- add to dictionary based on an incrementing value in 2 lists

我创建了 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'}    

如有任何帮助,我们将不胜感激, 提前致谢:)

您可以将两个指令与第一个分组:

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)

如果您想根据列表中的键进行排序,您将需要一个 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())

可以这样实现

temp_dict = {}
for x in list_a:
    val = x.split('|')[1]
    temp_dict[x] = [y for y in list_b if y.endswith("|" + val)]
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']}

你可以看到我们的区别仅在于将单身人士列入名单(我)或不列入名单(你)。我认为我的方法更好的原因是因为任何代码 using 如果 all 值是列表,这个结果可能会更容易,所以它不会需要处理单个字符串和字符串列表。就像我更容易 只生成 列表一样。

但如果您仍然喜欢您的方式,请将我上面的最后一行更改为:

my_dict = {k: v if len(v) > 1 else v[0] for k, v in tmp.values()}

这是一个非常易读的代码,应该足够清楚了,但如果您对它有疑问,请评论。如果您想在将键添加到字典时保持键的顺序,则可以使用 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)