我有两个单独的字典形式的元组列表。位于括号中的是我的键,括号中是我的值。
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行。
为什么我收到此错误?
答案 0 :(得分:1)
首先,当您执行for x, y in (f1, f2):
时,实际发生的是您正在创建两个文件对象的元组,并且您将迭代该元组(而不是文件对象本身),因此每次迭代将返回单个文件对象,但根据您的语法,它会尝试将文件对象解压缩为x
和y
两个变量,导致问题。
其次,当你执行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_f1
和digit1_f2
。