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

3
我可以帮助您翻译此内容。这是关于编程的内容。

我有两个单独的元组列表,它们采用字典的形式。括号中是键(key),方括号中是值(value)。

文件1:

('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范围内,那么 count+=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个回答

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

0

那不是正确的迭代两个事物的方式。相反,尝试使用以下方法:

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

这应该可以工作,但我不知道循环的实质,因为您没有提供digit1_f1digit1_f2是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接