基于if循环合并两个列表的内容

时间:2010-03-24 11:06:25

标签: python list loops

检查列表中的元素时遇到了一个小问题: 我有两个内容类似的文件

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中的字典;))。任何帮助都会很棒。

5 个答案:

答案 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的答案基本相同。