繁体   English   中英

遍历元组列表和字典列表

[英]Iterating through list of list of tuples and a dictionary

我有一个包含两个列表的列表,每个列表都有五个包含两个元素的元组。 像这样:

cos = [ [('B6409', 0.9997), ('S4193', 0.9996), ('C9826', 0.9995), ('J6706', 0.9994), ('Q0781', 0.9993)], [('A5474', 0.9985), ('H1286', 0.9981), ('Y1178', 0.998), ('D2742', 0.9979), ('A7668', 0.9979)] ]

还有一个像这样的字典'dist':

dist = {'R7033': [93.9636, 32.6327, 33.092, 32.1305, 31.7842] , 'P1283': [100.081, 32.3075, 34.4401, 37.3563, 43.815] , 'W7831': [93.3658, 33.5885, 31.215, 30.8853, 33.0429] , 'B6409': [91.0789, 30.327, 30.4114, 32.973, 31.5477, 'J6706': [99.9582, 34.7457, 32.913, 37.0979, 34.8625] }

我想做的是,如果字典中的一个键与元组中的第一个元素相同,则将该键的每个值的相同索引的所有值相加。 例如:

“B6409”与字典键“B6409”之一匹配,“J6706”也是如此。 因此,必须将键“B6409”中的列表的第一个元素添加到键“J6706”中的列表的第一个元素中。 依此类推,第二个,第三个,第四个和第五个元素。 这样我会得到:

(“B6049”的第一个元素加上“J6706”的第一个元素):91.0789 + 99.9582 = 191.0371

(“B6049”的第二个元素加上“J6706”的第二个元素):30.327 + 34.7457 = 65.0727

对于匹配的键中的 5 个元素中的每一个,依此类推...

到目前为止,我已经做了一些(我猜是硬编码),但是我认为这不是最好的迭代,而且我得到了一个错误;
TypeError: += 不支持的操作数类型: 'int' and 'str' @ ocw2 += i[0] (星号线)

for i in dist:
        if i == cos[0][0][0]:
            ocw += i[0]
            refl += i[1]
            lefl += i[2]
            icw += i[3]
            nw += i[4]
           
    
        if i == cos[0][1][0]:
            ocw += i[0]
            refl += i[1]
            lefl += i[2]
            icw += i[3]
            nw += i[4]
            
            
        if i == cos[0][2][0]:
            ocw += i[0] ***********
            refl += i[1]
            lefl += i[2]
            icw += i[3]
            nw += i[4]
           

有没有更好的方法来迭代匹配的键以找到字典值的每个索引的总和?

您应该尝试格式化您的列表和字典,如下所示。 它们以这种方式更具可读性,并且代码的阅读频率高于编写频率。

cos = [
    [
        ('B6409', 0.9997),
        ('S4193', 0.9996),
        ('C9826', 0.9995),
        ('J6706', 0.9994),
        ('Q0781', 0.9993)
    ], 
    [
        ('A5474', 0.9985),
        ('H1286', 0.9981),
        ('Y1178', 0.998),
        ('D2742', 0.9979),
        ('A7668', 0.9979)
    ] 
]

dist = {
    'R7033': [93.9636, 32.6327, 33.092, 32.1305, 31.7842], 
    'P1283': [100.081, 32.3075, 34.4401, 37.3563, 43.815], 
    'W7831': [93.3658, 33.5885, 31.215, 30.8853, 33.0429], 
    'B6409': [91.0789, 30.327, 30.4114, 32.973, 31.5477], 
    'J6706': [99.9582, 34.7457, 32.913, 37.0979, 34.8625]
}

每当你看到自己一遍又一遍地做同样的事情时,问问自己写一个函数是否是一个更好的主意。 大多数时候,答案是肯定的。 在我看来,您需要在这里编写一个函数来提高(至少)您的代码可读性。

你的问题不是很清楚,但根据我收集到的关于你的问题,这是我的答案-

# defining these as I don't have them in my namespace yet
# you should not paste this line
ocw = refl = lefl = icw = nw = 0


# Start copying from here
def some_func(l):
    global ocw, refl, lefl, icw, nw
    ocw += l[0]
    refl += l[1]
    lefl += l[2]
    icw += l[3]
    nw += l[4]


for k in dist:
    for sublist in cos:
        for t in sublist:
            if k == t[0]:
                some_func(dist[k])


print(ocw, refl, lefl, icw, nw)

尽管对于中到大型数据集来说,复杂性肯定是一个问题,但这应该可以满足您的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM