首页 > 解决方案 > 如何在 Python 中附加单个字典键 (1_key : [N_values]) 的值列表?

问题描述

我正在尝试从 .txt 文件在 Python 中生成一个 {single-key : [multi-value]} 字典。

这是文本文件(制表符分隔),

A02.835.583.748      A02.880     0.818181818181818
A02.835.583.748      A02.513     0.818181818181818
A02.835.583.748      A01.378.800.750     0.636363636363636
A02.835.583      A02.880     0.863636363636364
A02.835.583      A02.513     0.863636363636364
A02.835.583      A01.378.800.750     0.681818181818182
A01.378.800.750      A02.880     0.727272727272727
A01.378.800.750      A02.513     0.727272727272727
A01.378.800.750      A01.378.800.750     1

同样,我使用“defaultdict()”函数,但不知何故我无法正确生成字典。我可以通过这个生成字典,但这很奇怪。因此,我从这本奇怪的字典中获取其中一个键。

print(anaDict.get('A02.835.583.748'))

输出:

['A02.880=0.818181818181818', [...], ['A02.513=0.818181818181818'], ['A01.378.800.750=0.636363636363636']]

然而,这个字典中的 [...] 实际上是以一种初始的方式嵌套同一个键的其他值。

我写的代码,

anaDict = defaultdict()
anaSet = set()
with open(f, 'r') as anaFile:
    if '148' in f:
        for line in anaFile:
            key = line.split('\t')[0].rstrip()
            conclusionVal = line.split('\t')[1].strip()
            simScore = line.split('\t')[2].strip()
            value = [conclusionVal + "=" + simScore]
            if key not in anaDict:
                print("Here it goes: " , key, value)
                anaDict[key] = value                    
            if key in anaDict:
                print("Different value: ", key, value)
                anaDict[key].append(value)

        print(anaDict.get('A02.835.583.748'))

我希望代码生成以下字典(显示为键值对)。

A02.835.583.748 : [A02.880 = 0.818181818181818 , A02.513 = 0.818181818181818,  A01.378.800.750 = 0.636363636363636]
A02.835.583 : [A02.880 = 0.863636363636364, A02.513 = 0.863636363636364, A01.378.800.750 = 0.681818181818182]
A01.378.800.750 : [A02.880 = 0.727272727272727, A02.513  = 0.727272727272727, A01.378.800.750 = 1]

我无法弄清楚我做错了什么。我会为任何帮助或方向提供帮助。

标签: python-3.xdictionarymulti-value-dictionary

解决方案


这行是你的问题:

anaDict[key].append(value)

当您使用 时list#append,您将整个参数放入列表中。但是由于您要传递一个列表,因此您将一个列表放入列表中。您所描述的想要做的是附加参数列表中的所有值,而不是列表本身。您所要做的就是替换appendextend.

anaDict[key].extend(value)

然后你告诉解释器解包参数列表并附加每个值。


推荐阅读