2017-07-13 1 views
2

Ich versuche, eine Artikelliste mit spezifischen Mustern zu schaffen, so weit mein Design so ist,Vermeiden Sie doppelte während Liste der Elemente aus einer Reihe von Mustern erzeugen

patterns = [ 
    '{column1}{column2}', 
    '{column1}@{column3}', 
    '{column2}#{column4}', 
    '{column3}[email protected]#' 
] 

for c1 in possible_column1: 
    for c2 in possible_column2: 
    for c3 in possible_column3: 
     for c4 in possible_column4: 
      data = { 
      'column1': c1, 
      'column2': c2, 
      'column3': c3, 
      'column4': c4, 
      } 
      for pattern in patterns: 
       result.append(pattern.format(**data)) 

Das Design, die viele Probleme hat

  1. Es doppelte Werte schaffen, und ich habe
  2. Es ist eine list(set(result)) auf einzigartige die Liste langsam zu tun

Wie schreibt man solche Algorithmen?

Die patterns Liste variiert und wird vielleicht häufig, neue Art der Spalten geändert werden hinzugefügt und

P. S
Meiner Meinung nach ist dies von Permutationen unterscheidet.

+0

@xenteros es ist keine Permutation, es ist ein festes Muster – daisy

+1

@daisy Wenn es keine Permutation ist, verstehe ich Ihre Frage nicht. –

+0

@ Ev.Kounis aktualisiert das Muster – daisy

Antwort

2

Sie könnten eine andere Datenstruktur (ein dict) verwenden, um die Muster zu halten:

patterns = { 
    '{0}{1}': (possible_column1, possible_column2), 
    '{0}@{1}': (possible_column1, possible_column3), 
    '{0}#{1}': (possible_column2, possible_column4), 
    '{0}[email protected]#': (possible_column3,) 
} 

diesem Wörterbuch Mit Ihnen itertools.product auf den "Werten" dieses Wörterbuch verwenden können:

from itertools import product 

# Just some data for the possible columns... 
possible_column1 = list('12') 
possible_column2 = list('34') 
possible_column3 = list('56') 
possible_column4 = list('78') 

result = [] 
for pattern, cols in patterns.items(): 
    for prod in product(*cols): 
     result.append(pattern.format(*prod)) 

# or if you like it shorter: 
# result = [pattern.format(*prod) for pattern, cols in patterns.items() for prod in product(*cols)] 

Auf diese Weise erstellen Sie keine doppelten Einträge.

Verwandte Themen