在python中将两个预先排序的列表打印到一个输出文件中

时间:2012-07-10 17:19:48

标签: python list file-io merge

我有两个已经按需要排序的列表,我需要将它们放入一个文件中,如下例所示:

list1 = [a, b, c, d, e]
list2 = [1, 2, 3, 4, 5]

输出文件应如下所示:

a1
b2
c3
d4
e5

我对python来说相当新,所以我真的不确定如何进行文件编写。我使用with open(file, 'w') as f:阅读是一种更好/更简单的方式来启动写入块,但我不确定如何合并列表并打印它们。我可以将它们合并到第三个列表中并使用print>>f, item将其打印到文件中,但我想看看是否有更简单的方法。

谢谢!

延迟编辑:查看我的列表,它们不会总是相同的长度,但无论如何都需要打印所有数据。因此,如果list2转到7那么输出将需要是:

a1
b2
c3
d4
e5
6
7

反之亦然,其中list1可能比list2长。

5 个答案:

答案 0 :(得分:6)

使用zip()功能组合(即压缩)两个列表。例如,

list1 = ['a', 'b', 'c', 'd', 'e']
list2 = [1, 2, 3, 4, 5]

zip(list1, list2)

给出:

[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]

然后您可以格式化输出以满足您的需求。

for i,j in zip(list1, list2):
    print '%s%d' %(i,j)

得到以下特性:

a1
b2
c3
d4
e5

<强>更新

如果您的列表长度不等,请使用此方法 itertools.izip_longest()可能适合您:

import itertools
list1 = ['a', 'b', 'c', 'd', 'e']
list2 = [1, 2, 3]

for i,j in itertools.izip_longest(list1, list2): 
    if i: sys.stdout.write('%s' %i)
    if j: sys.stdout.write('%d' %j)
    sys.stdout.write('\n')

给出:

a1
b2
c3
d
e 

注意,如果您使用的是Python 3,那么可以使用print()函数。我在这里使用write()来避免项目之间的额外空格。

答案 1 :(得分:2)

你应该使用zip功能:

  

此函数返回元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素。

for a, b in zip(lis1, list2):
write(a, b)

答案 2 :(得分:1)

>>> list1 = ['a', 'b', 'c', 'd', 'e']
>>> list2 = [1, 2, 3, 4, 5]
>>> map(lambda x:x[0]+str(x[1]),zip(list1,list2))
['a1', 'b2', 'c3', 'd4', 'e5']

没有zip()

>>> map(lambda x,y:x+str(y), list1,list2)
['a1', 'b2', 'c3', 'd4', 'e5']

编辑: If the list2 is list2 = [1, 2, 3, 4, 5,6,7]然后使用izip_longest

>>> from itertools import zip_longest
>>> [y[0]+str(y[1]) if y[0]!=None  else y[1] for y in izip_longest(list1,list2,fillvalue=None)]
['a1', 'b2', 'c3', 'd4', 'e5', 6, 7]

答案 3 :(得分:0)

一个班轮:

print "\n".join(("%s%s" % t for t in zip(list1, list2)))

答案 4 :(得分:0)

简单......爱你的Python :)。

>>> from itertools import *
>>> L1 = list("abcde")
>>> L2 = range(1,8)
>>> [(x if x != None else '') + str(y) for (x,y) in izip_longest(L1,L2)]
['a1', 'b2', 'c3', 'd4', 'e5', '6', '7']
>>> print '\n'.join([(x if x != None else '') + str(y) for (x,y) in izip_longest(L1,L2)])
a1
b2
c3
d4
e5
6
7