检查列表中的元素时遇到了一个小问题: 我有两个内容类似的文件
file 1: file2:
47 358 47
48 450 49
49 56 50
我将两个文件解析为两个列表,并使用以下代码检查
for i in file_1:
for j in file_2:
j = j.split()
if i == j[1]:
x=' '.join(j)
print >> write_in, x
我现在试图得到一个“0”如果file_1的值不在file_2中,例如,值“48”不存在file_2所以我需要得到输出(只有一个空格)两个数字)这两个条件也应该只生成一个输出文件:
output_file:
358 47
0 48
450 49
56 50
我尝试使用字典方法,但我没有得到我想要的东西(实际上我不知道如何正确使用python中的字典;))。任何帮助都会很棒。
答案 0 :(得分:2)
r1=open('file1').read().split()
r2=open('file2').read().split()
d=dict(zip(r2[1::2],r2[::2]))
output='\n'.join(x in d and d[x]+' '+x or '0 '+x for x in r1)
open('output_file','wb').write(output)
测试
>>> file1='47\n48\n49\n50'
>>> file2='358 47\n450 49\n56 50'
>>>
>>> r1=file1.split()
>>> r2=file2.split()
>>>
>>> d=dict(zip(r2[1::2],r2[::2])) #
>>> d
{'47': '358', '50': '56', '49': '450'}
>>>
>>> print '\n'.join(x in d and d[x]+' '+x or '0 '+x for x in r1)
358 47
0 48
450 49
56 50
>>>
答案 1 :(得分:1)
您可以非常轻松地修改代码:
for i in file_1:
x = None
for j in file_2:
j = j.split()
if i == j[1]:
x = ' '.join(j)
if x is None:
x = ' '.join(['0', i])
根据您的输入,整个任务当然可以进一步简化。目前,您的代码的复杂程度为0(n**2)
。
答案 2 :(得分:1)
这是使用字典的可读解决方案:
d = {}
for k in file1:
d[k] = 0
for line in file2:
v, k = line.split()
d[k] = v
for k in sorted(d):
print d[k], k
答案 3 :(得分:0)
您可以尝试以下内容:
l1 = open('file1').read().split()
l2 = [line.split() for line in open('file2')]
for x, y in zip(l1, l2):
if x not in y:
print 0, x
print ' '.join(y)
但是如果你遵循你的逻辑,输出应该是
358 47
0 48
450 49
0 49
56 50
而不是
358 47
0 48
450 49
56 50
答案 4 :(得分:0)
def file_process(filename1, filename2):
# read first file with zeroes as values
with open(filename1) as fp:
adict= dict( (line.rstrip(), 0) for line in fp)
# read second file as "value key"
with open(filename2) as fp:
adict.update(
line.rstrip().partition(" ")[2::-2] # tricky, read notes
for line in fp)
for key in sorted(adict):
yield adict[key], key
fp= open("output_file", "w")
fp.writelines("%s %s\n" % items for items in file_process("file1", "file2"))
fp.close()
str.partition(“”)返回(前空格,空格,后空格)的元组。通过切片元组,从第2项(后空间)开始并向前移动-2,我们返回一个(后空间,前空间)元组,它们是描述字典的(键,值)解决方案。
PS Um :)我刚刚注意到我的答案与Daniel Stutzbach的答案基本相同。