Wie kann ich Permutationen einer langen Liste mit einer kürzeren Liste abgleichen (entsprechend der Länge der kürzeren Liste)? [duplicate]
Lesezeit: 7 Minuten
Benutzer1735075
Ich habe Probleme, mich um einen Algorithmus zu kümmern, den ich zu implementieren versuche. Ich habe zwei Listen und möchte bestimmte Kombinationen aus den beiden Listen nehmen.
Hier ist ein Beispiel.
names = ['a', 'b']
numbers = [1, 2]
die Ausgabe wäre in diesem Fall:
[('a', 1), ('b', 2)]
[('b', 1), ('a', 2)]
Ich könnte mehr Namen als Nummern haben, dh len(names) >= len(numbers). Hier ist ein Beispiel mit 3 Namen und 2 Nummern:
@ dm03514 Ich habe das gesehen und Beispiele für ähnliche Ziele mit itertools gefunden, aber ich erstelle Prototypen in Python, werde aber den endgültigen Code in einer anderen Sprache schreiben, sodass ich keine Tools verwenden möchte, die sonst nicht verfügbar sind.
– Benutzer1735075
17. Oktober 2012 um 13:19 Uhr
Das, wonach Sie fragen, ergibt keinen wirklichen Sinn. Wenn die erste Liste A,B,C und die zweite 1,2 enthält, welches Ergebnis würden Sie erwarten? Dies wäre möglich, wenn das von Ihnen gegebene Beispiel 4 verschiedene Ergebnisse mit jeweils einem Buchstaben und einer Zahl (A1, A2, B1, B2) hätte oder wenn beide Listen dieselbe Größe haben müssten.
– zwischenjay
17. Oktober 2012 um 13:24 Uhr
Ich stimme Interjay zu. Bitte geben Sie das Ergebnis im Fall der ungleichen Größe an, da es sonst nicht möglich ist, eine allgemeine Lösung bereitzustellen.
– Bakuriu
17. Oktober 2012 um 13:25 Uhr
Hinweis für zukünftige Leute, die Fragen zu dieser Frage stellen: Gibt es eine gute Chance, das kartesische Produkt einer Reihe von Listen zu erhalten? ist ein besseres doppeltes Ziel (viele Dinge, die verwendet werden sollten product wird hier dupliziert, obwohl diese Frage so nicht richtig gelöst ist). In selteneren Fällen Alle möglichen Ersetzungen von zwei Listen? möglicherweise besser (bei der Auswahl eines Werts aus einer von zwei Listen bei jedem Index, also a product Lösung wieder, mit a zip Vorlauf).
a = ["foo", "melon"]
b = [True, False]
c = list(itertools.product(a, b))
>> [("foo", True), ("foo", False), ("melon", True), ("melon", False)]
OP hat nicht nach einem kartesischen Produkt gefragt, und diese Antwort (wie auch die meisten anderen) liefert nicht das in der Frage angegebene erwartete Ergebnis.
– zwischenjay
18. Juli 2017 um 14:49 Uhr
@interjay du hast sehr recht, aber da zu viele Leute diese Antwort für richtig zu halten scheinen, kann ich nur davon ausgehen, dass dem Titel der Frage der Kontext fehlt.
– xpy
20. Juli 2017 um 9:11 Uhr
@xpy Der Titel ist zu kurz, um alles zu erklären. Deshalb müssen Sie die eigentliche Frage lesen.
– zwischenjay
20. Juli 2017 um 9:18 Uhr
OP wollte Permutationen, aber Google schickt jeden, der nach Kombinationen sucht (wie mich), zu dieser Antwort – froh zu sehen, dass es 8-mal so viele Stimmen hat!
– Josh Friedlander
24. Dezember 2018 um 15:38 Uhr
@JoshFriedlander Die meisten Leute, die nach diesen Dingen fragen, verstehen die Terminologie nicht. Daher gibt es unzählige Fragen, die die falsche Terminologie verwenden. Selbst wenn wir Duplikate aggressiv schließen und sicherstellen, dass alles auf das richtige Duplikat für das Problem von OP zeigt, landen wir immer noch in Fehlleitungen bei der Suche.
– Karl Knechtel
2. März um 0:35
Logik
Kann einfacher sein als das einfachste oben:
>>> a = ["foo", "bar"]
>>> b = [1, 2, 3]
>>> [(x,y) for x in a for y in b] # for a list
[('foo', 1), ('foo', 2), ('foo', 3), ('bar', 1), ('bar', 2), ('bar', 3)]
>>> ((x,y) for x in a for y in b) # for a generator if you worry about memory or time complexity.
<generator object <genexpr> at 0x1048de850>
ohne Import
Beste Lösung! Danke schön! Andere Lösungen sind entweder einfach falsch oder funktionieren nur in bestimmten Fällen wie a > b usw.
– Philipp Schwarz
16. Februar 2018 um 10:09 Uhr
Die pythonischste Lösung! (und vermeidet unnötige Importe)
– Dalker
4. August 2018 um 9:40 Uhr
Zeitkomplexität ist O(n^2)
– Deepak Sharma
26. Januar 2019 um 18:41 Uhr
Wettlösung!! Bare Basics sind immer der beste Weg
– Sabyasachi
23. Februar 2019 um 16:50 Uhr
Sicher, die Zeitkomplexität ist n^2, aber das ist doch sicher völlig unvermeidlich?
– Mattwmaster58
12. März 2022 um 1:15 Uhr
zwischenjay
Notiz: Diese Antwort bezieht sich auf die oben gestellte spezifische Frage. Wenn Sie von Google hier sind und nur nach einer Möglichkeit suchen, ein kartesisches Produkt in Python zu erhalten, itertools.product oder ein einfaches Listenverständnis kann das sein, wonach Sie suchen – siehe die anderen Antworten.
Vermuten len(list1) >= len(list2). Was Sie dann zu wollen scheinen, ist, alle Permutationen der Länge zu nehmen len(list2) aus list1 und sie mit Elementen aus list2 abgleichen. In Python:
import itertools
list1=['a','b','c']
list2=[1,2]
[list(zip(x,list2)) for x in itertools.permutations(list1,len(list2))]
Das Ergebnis ist genau das, was ich will, aber ist es möglich, die Logik dahinter zu teilen, wie man es macht? Wenn ich meinen Code in C oder Java konvertiere, habe ich keinen Zugriff auf Zip oder Itertools (obwohl sie das Leben sehr, sehr einfach machen).
@ user1735075: Wissen Sie, dass Python Open Source ist? Sie können also einfach die Quellen herunterladen und sehen, was sie tun. +1 an Mr. Steak für den Hinweis, dass die Dokumentation tatsächlich eine Beispielimplementierung enthält, die nicht verwendet wird zip und ähnliches.
– Bakuriu
17. Oktober 2012 um 13:42 Uhr
Ich kann das buchstäblich nicht zum Laufen bringen, selbst mit Ihrem Beispiel … alles, was ich bekomme, ist eine Liste von Zip-Objekten.. 😐
– m1nkeh
7. August 2018 um 10:00 Uhr
@logic bietet die akzeptierte Lösung.
– Bernhard Wagner
14. Juni 2019 um 20:44 Uhr
Ich habe nach einer mit sich selbst multiplizierten Liste mit nur eindeutigen Kombinationen gesucht, die als Funktion bereitgestellt wird.
Combinatoric generators:
Iterator | Results
-----------------------------------------+----------------------------------------
product(p, q, ... [repeat=1]) | cartesian product, equivalent to a
| nested for-loop
-----------------------------------------+----------------------------------------
permutations(p[, r]) | r-length tuples, all possible
| orderings, no repeated elements
-----------------------------------------+----------------------------------------
combinations(p, r) | r-length tuples, in sorted order, no
| repeated elements
-----------------------------------------+----------------------------------------
combinations_with_replacement(p, r) | r-length tuples, in sorted order,
| with repeated elements
-----------------------------------------+----------------------------------------
product('ABCD', repeat=2) | AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
permutations('ABCD', 2) | AB AC AD BA BC BD CA CB CD DA DB DC
combinations('ABCD', 2) | AB AC AD BC BD CD
combinations_with_replacement('ABCD', 2) | AA AB AC AD BB BC BD CC CD DD
Der beste Weg, um alle Kombinationen für eine große Anzahl von Listen herauszufinden, ist:
import itertools
from pprint import pprint
inputdata = [
['a', 'b', 'c'],
['d'],
['e', 'f'],
]
result = list(itertools.product(*inputdata))
pprint(result)
Nicht so leistungsfähig wie itertools, aber Sie verwenden Python, daher ist die Leistung bereits nicht Ihr Hauptanliegen …
Ich mag auch alle anderen Antworten!
Danke, tolle Antwort!
– toinbis
27. August 2019 um 15:30 Uhr
Idanmel
Vielleicht möchten Sie ein einzeiliges Listenverständnis ausprobieren:
>>> [name+number for name in 'ab' for number in '12']
['a1', 'a2', 'b1', 'b2']
>>> [name+number for name in 'abc' for number in '12']
['a1', 'a2', 'b1', 'b2', 'c1', 'c2']
14487200cookie-checkWie kann ich Permutationen einer langen Liste mit einer kürzeren Liste abgleichen (entsprechend der Länge der kürzeren Liste)? [duplicate]yes
docs.python.org/library/itertools.html
– dm03514
17. Oktober 2012 um 13:18 Uhr
@ dm03514 Ich habe das gesehen und Beispiele für ähnliche Ziele mit itertools gefunden, aber ich erstelle Prototypen in Python, werde aber den endgültigen Code in einer anderen Sprache schreiben, sodass ich keine Tools verwenden möchte, die sonst nicht verfügbar sind.
– Benutzer1735075
17. Oktober 2012 um 13:19 Uhr
Das, wonach Sie fragen, ergibt keinen wirklichen Sinn. Wenn die erste Liste A,B,C und die zweite 1,2 enthält, welches Ergebnis würden Sie erwarten? Dies wäre möglich, wenn das von Ihnen gegebene Beispiel 4 verschiedene Ergebnisse mit jeweils einem Buchstaben und einer Zahl (A1, A2, B1, B2) hätte oder wenn beide Listen dieselbe Größe haben müssten.
– zwischenjay
17. Oktober 2012 um 13:24 Uhr
Ich stimme Interjay zu. Bitte geben Sie das Ergebnis im Fall der ungleichen Größe an, da es sonst nicht möglich ist, eine allgemeine Lösung bereitzustellen.
– Bakuriu
17. Oktober 2012 um 13:25 Uhr
Hinweis für zukünftige Leute, die Fragen zu dieser Frage stellen: Gibt es eine gute Chance, das kartesische Produkt einer Reihe von Listen zu erhalten? ist ein besseres doppeltes Ziel (viele Dinge, die verwendet werden sollten
product
wird hier dupliziert, obwohl diese Frage so nicht richtig gelöst ist). In selteneren Fällen Alle möglichen Ersetzungen von zwei Listen? möglicherweise besser (bei der Auswahl eines Werts aus einer von zwei Listen bei jedem Index, also aproduct
Lösung wieder, mit azip
Vorlauf).– ShadowRanger
5. März 2019 um 19:16 Uhr