2

我有以下问题:

我需要在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”s,但如果我一次迭代两个列表,我不确定该怎么做,谢谢 :)

4

4 回答 4

4

利用zip

for num, name in zip(numbers, names):
    print('{0}, {1}'.format(num, name))
于 2012-11-16T05:57:56.183 回答
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()))
于 2012-11-16T05:58:05.040 回答
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])

如果名称多于数字,则此代码尤其会引发异常,因此您可能需要添加一些代码来处理它。

于 2012-11-16T05:59:10.293 回答
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())

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

于 2012-11-16T08:36:16.370 回答