Python-用重复的键值用“ zip”组合多个列表

时间:2018-07-20 00:05:37

标签: python

我知道字典不能有重复的键,这很有意义...

这就是我所拥有的。

a = ['02', '02', '03']
b = ['01', '02', '01']
c = ['10G', '10G', '10G']
d = ['08', '07', '09']

newDict = dict(zip(a, zip(b, c, d)))
print(newDict)

此代码产生-

{'03': ('01', '10G', '09'), '02': ('02', '10G', '07')}

由于缺少“ 02”,因此我缺少一组数据。并且字典不能有重复的键。

将a + b作为字典键组合以输出-

{'0201': ('10G', '08'),'0202': ('10G', '07'), '0301': ('10G', '09')}

那是怎么做到的?

我尝试过 newDict = dict(zip(a + b,zip(c,d)))
但这没用

2 个答案:

答案 0 :(得分:1)

我们可以使用字典理解。我们也不需要嵌套的zip

{x+y: (z, w) for x, y, z, w in zip(a, b, c, d)}
# {'0201': ('10G', '08'), '0202': ('10G', '07'), '0301': ('10G', '09')}

答案 1 :(得分:0)

即使每个前导字符在其行中都是唯一值,也无需将其连接起来。相反,您可以使用递归来找到适当的级别,该级别将获得唯一的密钥:

import itertools, collections
a = ['02', '02', '03']
b = ['01', '02', '01']
c = ['10G', '10G', '10G']
d = ['08', '07', '09']
def group_data(_start):
  new_l = [[a, [c for _, *c in b]] for a, b in itertools.groupby(sorted(_start, key=lambda x:x[0]), key=lambda x:x[0])]
  _d = {}
  for a, b in new_l:
    if len(b) == 1:
      _d[a] = tuple(b[0])
    else:
      _d.update(group_data([[a+i, *c] for [i, *c] in b]))
  return _d

print(group_data(list(zip(a, b, c, d))))

输出:

{'0201': ('10G', '08'), '0202': ('10G', '07'), '03': ('01', '10G', '09')}