2

次の問題があります。

Pythonで2つのリストをそれぞれ「混合」する必要があります...

私はこれを持っています:

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 の名前が出力されます。次のように、名前と数字をコンマ (,) で区切って 1 行に出力する新しいファイル (txt) を作成する必要があります。

Name1,64673635
Name2,63513635
Name3,67867635
Name4,12312635
Name5,78679635
Name6,63457635
Name7,68568635
..... and so on...

「for」を試してみましたが、一度に2つのリストを繰り返している場合の方法がわかりません。ありがとう:)

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

zip2 つのリストを結合して、ファイルに書き込めるようにします。

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

ただし、少し時間を節約できます。コードでは、各ファイルを個別に繰り返し処理し、それぞれからリストを作成しています。両方を同時に反復処理して、1 回のスイープでリストを作成することもできます。

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、ペアをリストに追加して、 を反復処理します。list ステップを切り取って、同じループで 3 番目のファイルに直接書き込むこともできます。

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

このように 2 つのリストを混在させる "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's answer)。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())

これにより、各ファイルを一度に 1 つずつメモリに完全に読み込むのではなく、2 つのファイルを並行して読み込みます。

于 2012-11-16T08:36:16.370 に答える