在python中分别“混合”两个列表的简单方法?

时间:2012-11-16 05:54:56

标签: python file list

我有以下问题:

我需要在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”但如果我一次迭代两个列表,我不知道如何做到这一点,谢谢:)

4 个答案:

答案 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())

这将并行读取两个文件,而不是一次一个地将每个文件完全读入内存。