Python中的复杂数据操作

Python中的复杂数据操作,python,file,dictionary,multiple-columns,Python,File,Dictionary,Multiple Columns,我有3个包含真实数据、伪数据和真实数据值的文件 File_one有两列,其中一列为实际数据,第二列为转换数据。即,对于真实数据,给出了一个伪值 col[0] col[1] 123 0 234 1 345 2 456 3 567 4 678 5 File\u two具有成对的伪值,即代替123使用的值是0,伪值对的方式与[0,1]相同,这意味着[123,234]为实 col[0] col[1] 0 2 0 3 0

我有3个包含真实数据、伪数据和真实数据值的文件

File_one
有两列,其中一列为实际数据,第二列为转换数据。即,对于真实数据,给出了一个伪值

col[0] col[1]
123     0
234     1
345     2
456     3
567     4
678     5
File\u two
具有成对的伪值,即代替
123
使用的值是
0
,伪值对的方式与
[0,1]
相同,这意味着
[123,234]
为实

col[0]  col[1]
0        2
0        3
0        5
2        4
5        1
因此可以说
file\u-two的
col[0]和col[1]
是键,值在
file\u-one
col[0]

现在,我必须将
file\u-two
中的伪值对与
file\u-one
中的真实数据
col[0]
进行匹配,并获得一个将其保存到新文件的输出。我们把它命名为
file\u four
。这里成对只出现一次

col[0]  col[1]
123     345
123     456
123     678
345     567
678     234
现在,图片中出现了三个
文件<代码>文件\u three
有3列

col[0]
col[1]
是与
file\u four
中相同的对,但它们还有许多其他对,而
file\u four
中没有

三号文件

col[0]  col[1]  col[2]
123     345       54
345     262       65
123     456       54
2456    2467      98
123     678       46
7845    2458      631
345     567       153
3456    3673      94
678     234       5
最后,我需要匹配
file\u-four
的对,即
col[0]col[1]
并从
file\u-four
中的
col[2]
中提取值,并生成一个新的
output\u-file
,其中
file\u-four
的对作为键,值在
col[2]

在下面的代码中,我只考虑前两个文件

from collections import defaultdict

d1 = dict()
d2 = dict()

with open('input1.txt', 'r') as file1:
    for row in file1:
        c0, c1 = row.split()[:2]
        d1[c1] = c0
with open('input2.txt', 'r') as file2:
    for row in file2:
        c0, c1 = row.split()[:2]
        d2[(c0, c1)] = [d1[c1], d1[c1]]

#for k, v in sorted(d2.items()):
    #print '\t'.join(v)
print d2

Error:

Key Error: 'key' 

即使没有注释for循环,并且注释了最后一次打印,也会出现相同的错误。

您没有匹配的键,因为
d1
包含成对的键,而
d2
包含单个值

这一行看起来好像是错的:

    key =  col[0], col[1]

对于
d1
,使用file1第1列作为键,第0列作为值创建查找表:

f1 = [(123,0),(234,1),(345,2),(456,3),(567,4),(678,5)]
f2 = [(0,2),(0,3),(0,5),(2,4),(5,1)]

d1 = {c1:c0 for c0,c1 in f1}
这允许您使用file2列值在
d1

d2 = {(c0, c1):[d1[c0], d1[c1]] for c0, c1 in f2}
print d2

>>>
{(5, 1): [678, 234], (0, 3): [123, 456], (0, 5): [123, 678], (0, 2): [123, 345], (2, 4): [345, 567]}
>>>
文件1和文件2的代码已重构

d1, d2 = dict(), dict()
with open('inputfile1.txt', 'r') as file1:
    for row in file1:
        c0, c1 = row.strip().split()[:2]
        d1[c1] = c0

with open('inputfile2.txt', 'r') as file2:
    for row in file2:
        c0, c1 = row.strip().split()[:2]
        d2[(c0, c1)] = [d1[c0], d1[c1]]

>>> for k, v in sorted(d2.items()):
    print '\t'.join(v)


123 345
123 456
123 678
345 567
678 234
>>> 
在分配期间解包值/项目:

>>> 
>>> x, y, z = [1, 2, 3]
>>> print x, y, z
1 2 3
>>> x, y = [1, 2, 3]

Traceback (most recent call last):
  File "<pyshell#259>", line 1, in <module>
    x, y = [1, 2, 3]
ValueError: too many values to unpack
>>> 
>>> a, b, _, _, _, _ = '1 2 3 4 5 6'.split()
>>> print a, b, _
1 2 6
>>> 
>
>>>x,y,z=[1,2,3]
>>>打印x,y,z
1 2 3
>>>x,y=[1,2,3]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
x、 y=[1,2,3]
ValueError:要解压缩的值太多
>>> 
>>>a,b,,,,,='123456'.split()
>>>打印a、b、_
1 2 6
>>> 

输入文件1有一对键,这些键在文件2中只有一列中有值,我需要成对的输出作为
[value\u of_K1 value\u of_K2]
这看起来很棒,比我试图写的要简单得多。但是我得到了一个错误:
c0,c1=row.split()
ValueError:要解包的值太多
如果文件有两列以上,就会发生异常。我假设您的文件(#1和#2)是结构化的-值空白值。如果<代码>行.SPLIT()/代码>导致两个以上的项目,那么您可能需要对生成的列表进行重构和索引,或者确保在赋值左侧的足够的名称来解释<代码>行.SPLIT()/CARD>中的所有项目。文件也有其他列,但我们不必考虑它们。所以我没有提及只是为了避免混淆。有几种方法可以解决这个问题。如果您使用的是Python3.x,那么可以使用扩展解包->
a、b、*c=[1、2、3、4、5、6]
。您可以直接从
row.split()
为所需的项目编制索引。第三个选项请参见编辑。在阅读和尝试跟踪代码时,它是完全正确的,但我得到了关键错误。代码已更新。在此处发布错误时,最好发布完整的回溯。当您试图从字典中检索不存在的内容时,会发生错误。打印语句在解决类似问题时会有很大帮助。将语句包装在Try/Except块中,并打印有问题的值,可能还有字典。在拆分每行之前,可能需要去掉每行的空白。你可能想花一些时间在文档中的教程上,也许