簡體   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