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

Benutzeravatar von user1735075
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:

names = ['a', 'b', 'c']
numbers = [1, 2]

Ausgang:

[('a', 1), ('b', 2)]
[('b', 1), ('a', 2)]
[('a', 1), ('c', 2)]
[('c', 1), ('a', 2)]
[('b', 1), ('c', 2)]
[('c', 1), ('b', 2)]

  • 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 a product Lösung wieder, mit a zip Vorlauf).

    – ShadowRanger

    5. März 2019 um 19:16 Uhr

Benutzeravatar von DrIDK
DrIDK

Der einfachste Weg ist die Verwendung itertools.product:

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

Benutzeravatar von logic
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

Benutzeravatar von interjay
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))]

Kehrt zurück

[[('a', 1), ('b', 2)], [('a', 1), ('c', 2)], [('b', 1), ('a', 2)], [('b', 1), ('c', 2)], [('c', 1), ('a', 2)], [('c', 1), ('b', 2)]]

  • 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).

    – Benutzer1735075

    17. Oktober 2012 um 13:39 Uhr

  • @ user1735075 Schau dir die an Dokumentation

    – Faultier

    17. Oktober 2012 um 13:40 Uhr

  • @ 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.

import itertools
itertools.combinations(list, n_times)

Hier als Auszug aus die Python-Dokumentation auf itertools Das könnte Ihnen helfen, das zu finden, wonach Sie suchen.

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)

das Ergebnis wird sein:

[('a', 'd', 'e'),
 ('a', 'd', 'f'),
 ('b', 'd', 'e'),
 ('b', 'd', 'f'),
 ('c', 'd', 'e'),
 ('c', 'd', 'f')]

  • Danke, tolle Antwort!

    – toinbis

    27. August 2019 um 15:30 Uhr

Fletch F Fletchs Benutzeravatar
Fletch F Fletch

Oder die KISS-Antwort für kurze Listen:

[(i, j) for i in list1 for j in list2]

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

Benutzeravatar von Idanmel
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']

1448720cookie-checkWie kann ich Permutationen einer langen Liste mit einer kürzeren Liste abgleichen (entsprechend der Länge der kürzeren Liste)? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy