当存在重复项时,如何将两个元素的列表转换为字典(一个元素为键,另一个为值)



因此,我以以下方式获得了一个列表列表。

ab_list = [['AB','35'],['AB','78'],['CD','98'],['CD','41'],['CD','67'].....]

现在,我想将这个列表转换成一个字典,使其具有以下形式:

ab_dict = {'AB':'35|78','CD':'98|41|67'.........}

因此,如果列表的第二个元素重复,它应该通过管道连接,这将成为值。我不知道该怎么做。我正在尝试的代码是:

for val in ab_list:
for value in final_list:
if val[0] == value[0]:
value[1] = value[1] + "|" + val[1]

但这并不能正常工作。如何做到这一点?

这是一种使用setdefault和简单迭代的方法。

例如:

ab_list = [['AB','35'],['AB','78'],['CD','98'],['CD','41'],['CD','67']]
result = {}
for k, v in ab_list:
result.setdefault(k, []).append(v)
ab_dict = {k: "|".join(v) for k, v in result.items()}
print(ab_dict)

输出:

{'AB': '35|78', 'CD': '98|41|67'}
ab_list = [['AB', '35'], ['AB', '78'], ['CD', '98'], ['CD', '41'], ['CD', '67']]
ab_dict = {}
for k, v in ab_list:
if k in ab_dict:
ab_dict[k] += '|' + v
else:
ab_dict[k] = v
print(ab_dict)

输出:

{'AB': '35|78', 'CD': '98|41|67'}

EDIT:下面的解决方案只有在具有相同第一个元素的所有对都是连续的情况下才有效,这是示例中的情况,但可能不是一般情况(否则您需要首先对列表进行排序才能使其起作用,这不是一个很好的解决方案(。

这是使用groupby:的一种方法

from itertools import groupby
ab_list = [['AB', '35'], ['AB', '78'], ['CD', '98'], ['CD', '41'], ['CD', '67']]
ab_dict = {k: '|'.join(it[1] for it in v) for k, v in groupby(ab_list, lambda it: it[0])}
print(ab_dict)
# {'AB': '35|78', 'CD': '98|41|67'}

试试这个:

# Stage-1
#
lst = [['AB', '35'], ['AB', '78'], ['CD', '98']]
tmp = []
for i in lst:
tmp.append(i[0])
tmp = list(set(tmp))
# Stage-2
#
dct = {}
for i in tmp:
dct.update({i: []})
for i in lst:
dct[i[0]].append(i[1])
# Stage-3
#
final = {}
for i, j in dct.items():
string = ''
if len(j) == 1:
string = j[0]
else:
for k in j:
string += k + ' | '
string = string[:-3]
final.update({i: string})

结果:

{'AB': '35 | 78', 'CD': '98'}

相关内容

  • 没有找到相关文章

最新更新