Python中的复杂数据操作
我有3个包含真实数据、伪数据和真实数据值的文件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
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块中,并打印有问题的值,可能还有字典。在拆分每行之前,可能需要去掉每行的空白。你可能想花一些时间在文档中的教程上,也许