如何在Python中比较两个不同的元组列表中的键?

时间:2015-07-07 17:16:26

标签: python python-3.x dictionary

我有两个单独的字典形式的元组列表。位于括号中的是我的键,括号中是我的值。

File1中:

('8', '158116110')
['0.00509']
('6', '44338625')
['0.00525']
('3', '127518469')
['2.56E-05']
('9', '141754441')
['0.00585']

文件2:

('9', '154331672')
['0.165435473']
('8', '100949929')
['0.493410385']
('9', '120747803')
['0.969364472']
('1', '12152579')
['0.669831913']

专门处理两个列表中的键,我想计算这些键中有多少键在10000范围内。

如果你注意到,我每个值有两个键。我希望我的代码以这种方式格式化,而:如果File1中的单个键的第一个数字(例如“8”)等于File2中单个键的第一个数字(例如“8”)并且如果这些单独键的第二个数字(例如'158116110'和'100949929')彼此相距10000,计数+ = 1

这就是我到目前为止:

with open('filename1.txt') as f1, open('filename2.txt') as f2:
x, y = f1, f2
count = 0
for x, y in (f1, f2):
    if ((f2 - f1) < 10000) and (digit1_f1 == digit1_f2):
        count +=1
    break

但是代码失败了。我收到这个错误:

Traceback (most recent call last):
  File "/Users/macbookpro/Desktop/compareDict.py", line 4, in <module>
for x, y in (f1, f2):
  ValueError: too many values to unpack (expected 2)

两个列表长度相等,每个包含9524行。

为什么我收到此错误?

2 个答案:

答案 0 :(得分:1)

首先,当您执行for x, y in (f1, f2):时,实际发生的是您正在创建两个文件对象的元组,并且您将迭代该元组(而不是文件对象本身),因此每次迭代将返回单个文件对象,但根据您的语法,它会尝试将文件对象解压缩为xy两个变量,导致问题。

其次,当你执行f2-f1时,你只是尝试来减去两个文件对象(这是不可能的)。

我认为,根据您的示例,具有相同第一个键的行可以在不同的行中,最好首先为每个文件创建两个词典。字典的格式可以是 -

d1 = {<first key> : { <second key one>: value , <second key two>: value .... }}

示例 -

d1 = {'8' : { '158116110' : '0.00509' } , '9' : { '141754441' : '0.00585' } ... }

一旦创建了两个字典,您就可以循环遍历一个字典,然后从另一个字典中获取相同的密钥(从两个字典中获取该密钥的值)并检查它们是否具有10000范围内的值。

示例代码 -

d = {}
for k,v in d1.items():
    v1 = d2.get(k)
    if v1:
        for k1 in v.keys():
            for k2 in v1.keys():
                if abs(int(k1) - int(k2)) < 10000:
                    if k in d:
                        d[k] += 1
                    else:
                        d[k] = 0

答案 1 :(得分:0)

这不是迭代两件事的正确方法。而是尝试:

for x, y in zip(f1, f2):

这应该有用,虽然我不知道循环的内容,因为你还没有提供digit1_f1digit1_f2