我有以下问题:
我需要在python中分别“混合”两个列表...
我有这个:
names = open('contactos.txt')
numbers = open('numeros.txt')
names1 = []
numbers1= []
for line in numbers:
numberdata = line.strip()
numbers1.append(numberdata)
print numbers1
for line in names:
data = line.strip()
names1.append(data)
print names1
names.close()
numbers.close()
首先打印300个数字,后面打300个名字,我需要做的是创建一个新文件(txt),用一行逗号(,)分隔打印名称和数字,像这样:
Name1,64673635
Name2,63513635
Name3,67867635
Name4,12312635
Name5,78679635
Name6,63457635
Name7,68568635
..... and so on...
我希望你能帮助我做到这一点,我已尝试过“for”但如果我一次迭代两个列表,我不知道如何做到这一点,谢谢:)
答案 0 :(得分:4)
利用zip
:
for num, name in zip(numbers, names):
print('{0}, {1}'.format(num, name))
答案 1 :(得分:3)
zip
将两个列表组合在一起,让您将它们写入文件:
In [1]: l1 = ['one', 'two', 'three']
In [2]: l2 = [1, 2, 3]
In [3]: zip(l1, l2)
Out[3]: [('one', 1), ('two', 2), ('three', 3)]
但是你可以节省一点时间。在您的代码中,您将分别迭代每个文件,从每个文件创建一个列表。您也可以同时迭代这两个,在一次扫描中创建列表:
results = []
with open('contactos.txt') as c:
with open('numeros.txt') as n:
for line in c:
results.append([line.strip(), n.readline().strip()])
print results
这使用with
语句(上下文管理器),它基本上为您处理文件的关闭。这将迭代contactos
,从numeros
读取一行并将该对添加到列表中。您甚至可以删除列表步骤并在同一循环中直接写入第三个文件:
with open('output.txt', 'w') as output:
with open('contactos.txt', 'r') as c:
with open('numeros.txt', 'r') as n:
for line in c:
output.write('{0}, {1}\n'.format(line.strip(), n.readline().strip()))
答案 2 :(得分:3)
以这种方式混合两个列表的“pythonic”方法是zip函数!
names = open('contactos.txt')
numbers = open('numeros.txt')
names1 = []
numbers1= []
for line in numbers:
numberdata = line.strip()
numbers1.append(numberdata)
for line in names:
data = line.strip()
names1.append(data)
names.close()
numbers.close()
for name, number in zip(names1, numbers1):
print '%s, %s' % (name number)
还有其他更好的方法来打印格式化文本(例如Yuushi的答案)。我还想使用with
语句和列表推导,例如
with open('contactos.txt') as f:
names = [line.strip() for line in f]
with open('numeros.txt') as f:
numbers = [line.strip() for line in f]
for name, number in zip(names, numbers):
print '%s, %s' % (name, number)
最后,我只想评论如何在没有zip功能的情况下做到这一点。如果有不同数量的数字和名称,我不确定你想要做什么,但你可以使用像这样的for
循环来获取最后一位来在单个for循环中访问两个列表中的值:
for i in range(len(numbers)):
print '%s, %s' % (names[i], numbers[i])
如果名称多于数字,则此代码特别会引发异常,因此您可能希望添加一些代码来处理它。
答案 3 :(得分:0)
一下子:
import itertools
with open('contactos.txt') as names, open('numeros.txt') as numbers:
for num, name in itertools.izip(numbers, names):
print '%s, %s' % (num.strip(), name.strip())
这将并行读取两个文件,而不是一次一个地将每个文件完全读入内存。