2 Stimmen

Einfacher Weg, um zwei Listen in Python "zu mischen" bzw. zusammenzuführen?

Ich habe folgendes Problem:

Ich muss bzw. möchte zwei Listen in Python "mischen"...

Ich habe das hier:

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

Dies druckt zuerst etwa 300 Nummern und später die entsprechenden 300 Namen aus. Was ich tun muss, ist eine neue Datei (txt) zu erstellen, die die Namen und Nummern in einer Zeile druckt, getrennt durch ein Komma (,), wie hier:

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

Ich hoffe, dass du mir dabei helfen kannst, das zu tun. Ich habe es mit "for"-Schleifen versucht, bin mir jedoch nicht sicher, wie ich es machen soll, wenn ich gleichzeitig über zwei Listen iteriere. Vielen Dank :)

4voto

Yuushi Punkte 24524

Nutzen Sie zip:

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

3voto

RocketDonkey Punkte 35331

zip wird die beiden Listen zusammenführen und es Ihnen ermöglichen, sie in eine Datei zu schreiben:

In [1]: l1 = ['eins', 'zwei', 'drei']

In [2]: l2 = [1, 2, 3]

In [3]: zip(l1, l2)
Out[3]: [('eins', 1), ('zwei', 2), ('drei', 3)]

Sie können sich jedoch etwas Zeit sparen. In Ihrem Code iterieren Sie über jede Datei separat und erstellen eine Liste aus jeder. Sie könnten auch gleichzeitig über beide iterieren und Ihre Liste auf einen Schlag erstellen:

ergebnisse = []
with open('contactos.txt') as c:
    with open('numeros.txt') as n:
       for line in c:
          ergebnisse.append([line.strip(), n.readline().strip()])

print ergebnisse

Dies verwendet ein with-Statement (Kontextmanager), das im Grunde das Schließen von Dateien für Sie übernimmt. Dies wird durch contactos iterieren, eine Zeile aus numeros lesen und das Paar der Liste hinzufügen. Sie können sogar den Schritt mit der Liste entfernen und direkt in der gleichen Schleife in Ihre dritte Datei schreiben:

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

3voto

jmilloy Punkte 7179

Ein "pythonischer" Weg, um zwei Listen auf diese Weise zu mischen, ist die zip Funktion!

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)

Es gibt andere und bessere Möglichkeiten, formatierten Text auszugeben (z.B. die Antwort von Yuushi). Ich mag auch die Verwendung des with-Statements und List Comprehensions, z.B.

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)

Zuletzt möchte ich nur darauf eingehen, wie du es ohne die zip-Funktion machen könntest. Ich bin mir nicht sicher, was du tun möchtest, wenn es eine unterschiedliche Anzahl von Zahlen und Namen gibt, aber du kannst eine for-Schleife wie diese für das letzte Stück verwenden, um die Werte aus beiden Listen in einer einzelnen Schleife zu erreichen:

for i in range(len(numbers)):
    print '%s, %s' % (names[i], numbers[i])

Dieser Code wird insbesondere eine Ausnahme werfen, wenn es mehr Namen als Nummern gibt, daher würdest du wahrscheinlich einige Codezeilen hinzufügen wollen, um das zu behandeln.

0voto

Eric Punkte 90800

Alles auf einmal:

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

Dies liest die beiden Dateien parallel ein, anstatt jede Datei nacheinander vollständig in den Speicher zu laden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X