簡體   English   中英

在python中分別“混合”兩個列表的簡單方法?

[英]Simple way to “mix” respectively two lists in python?

我有以下問題:

我需要在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”但我不確定如何做到這一點,如果我一次迭代兩個列表,謝謝:)

利用zip

for num, name in zip(numbers, names):
    print('{0}, {1}'.format(num, name))

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

以這種方式混合兩個列表的“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])

如果名稱多於數字,則此代碼將拋出異常,因此您可能希望添加一些代碼來處理它。

全部一起:

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

這將並行讀取兩個文件,而不是一次一個地將每個文件完全讀入內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM