Python 创建嵌套字典(使用for循环?)

Python 创建嵌套字典(使用for循环?),python,dictionary,Python,Dictionary,我是python的初学者,目前对某些东西有点困惑。我有一个名为“variables”的7个变量的列表,还有一个名为“file”的大型tsv文件。在tsv文件的第1列中,“变量”列表中有7个变量的多个条目,对于每个变量条目,第2列中都有结果,看起来像这样,但规模更大(没有标题): 变量1 结果1 变量1 结果2 变量1 结果3 变量1 结果4 变量1 结果5 变量2 结果6 变量2 结果7 变量2 结果8 变量2 结果9 变量3 结果10 变量4 结果11 变量4 结果12 变量4 结果13 变量

我是python的初学者,目前对某些东西有点困惑。我有一个名为“variables”的7个变量的列表,还有一个名为“file”的大型tsv文件。在tsv文件的第1列中,“变量”列表中有7个变量的多个条目,对于每个变量条目,第2列中都有结果,看起来像这样,但规模更大(没有标题):

变量1 结果1 变量1 结果2 变量1 结果3 变量1 结果4 变量1 结果5 变量2 结果6 变量2 结果7 变量2 结果8 变量2 结果9 变量3 结果10 变量4 结果11 变量4 结果12 变量4 结果13 变量5 结果14 变量5 结果15 变量5 结果16 可变的 结果17 可变7 结果18 可变7 结果19 可变7 结果20 您使用的术语“嵌套”词典有点误导。 本质上,您只需要通过变量累积结果

您可以采取以下方法

打开(“文件路径”、“r”)作为f:
content=f.read()
行=[line.split('\t'),用于内容中的行。split('\n')]
结果={}
对于行中的行:
varname,结果=行[0],行[1]
如果results.get(varname)为无:
结果[varname]={result:“1”}
其他:
结果[varname][result]=“1”
results.get()
是一种检查字典中是否存在该值的方法。如果没有,则返回
None
,触发条件的第一部分以启动字典,否则只需添加到字典中

当然,你可以优化东西,使用其他的内置结构,如果它们更适合你的需要。例如,如果您对可变结果对的计数感兴趣,您可以执行以下操作

从集合导入defaultdict,计数器
#读上面的行
结果=默认DICT(计数器)
对于行中的行:
结果[第[0]行]。更新([第[1]行])
#结果[行[0]][行[1]+=1#另一种方式

这避免了检查,并将生成一个字典,其中包含结果出现的次数,使用
variableX

IIUC,以下代码将生成所需的结果

with open('my_file.txt', 'r') as f:
    results = {}              # dictionary to hold results
    for line in f:
        line = line.rstrip()  # remove '\n' at end of line
        v, r = line.split()   # get variable and result
        results.setdefault(v, {})  # adding a dictionary for variable var (if it doesn't exists)
        results[v][r] = "1"   # Adding key with results and number
    
from pprint import pprint as pp
pp(results)                   # Using pretty-print rather than normal print to show structure
输出

{'variable1': {'result1': '1',
               'result2': '1',
               'result3': '1',
               'result4': '1',
               'result5': '1'},
 'variable2': {'result6': '1', 'result7': '1', 'result8': '1', 'result9': '1'},
 'variable3': {'result10': '1'},
 'variable4': {'result11': '1', 'result12': '1', 'result13': '1'},
 'variable5': {'result14': '1', 'result15': '1', 'result16': '1'},
 'variable6': {'result17': '1'},
 'variable7': {'result18': '1', 'result19': '1', 'result20': '1'}}

由于您的
variableX
键是编号的,所以在外部部分使用列表而不是字典不是更有意义吗?我投票了,但请注意,您想要的字符串
“1”
,而不是数字
1
(即对您的解决方案进行了一个小的更改)。实际上,您的解决方案产生了一个键错误。我更新了它,if条件实际上得到了尊重。(也修复了
“1”
,尽管该位OP无论如何都会在以后覆盖,所以该值并不重要)