2017-11-10 1 views
-2

Ich habe eine Liste von Sequenzen, die als Strings angegeben sind, wie ['0',.....,'10']. Wenn ich itertools.combinations verwende, um eine Kombination von 2s wie ('0','2') zu erhalten, bemerke ich, dass die '10' nicht als eine einzelne Entität gezählt wird. I.e. Ich sehe keine ('2','10'), stattdessen sehe ich eine ('2','1','0') oder eine beliebige Kombination mit 10. Es wird als 1,0 betrachtet und dann werden die Kombinationen gebildet. Ich würde mich über eine Lösung dafür freuen. Ich habe darüber nachgedacht, das Format in int umzuwandeln, aber ich möchte nach der Bildung von Länge 2-Kombinationen immer größere Kombinationen wie (1,2,3) bilden.'10' Eine Zeichenfolge wird in 1,0 aufgeteilt, wenn itertools-Kombinationen verwendet werden

def frequentPattern(data, minsup): 
    frequentSets = [] 
    itemset = {} 


    for line in data: 
     for c in line.replace(',','').split(): 

      if itemset.get(c)==None: 
       itemset[c]=0 
      itemset[c]+=1 

    k = 1 
    while itemset != {}: 
     prevCandidates = [] 
     print itemset.keys() 
     for i in itemset.keys(): 
      print i 
      if itemset[i] >= minsup: 
       prevCandidates.append(i) 
       if i not in frequentSets: 
        frequentSets.append(i) 

     candidates = [] 
     for i in itertools.combinations(prevCandidates,2): 
      cell = tuple(set(i[0]+i[1])) 
      #print cell 
      #cell = tuple(sorted(cell)) 
      if len(cell)<=(k+1): 
       candidates.append(cell) 
     candidates = list(set(candidates)) 

     itemset = {} 
     for line in data: 
      for cell in candidates: 
       if set(cell) <= set(tuple(line.replace(',','').split())): 
        if itemset.get(cell)==None: 
         itemset[cell]=0 
        itemset[cell]+=1 

     k = k+1 
    return frequentSets 

Wie erwähnt ist das Problem mit der Zelle = tuple (set (i [0] + i [1])) wurde Linie. Siehst du einen Weg um ihn herum? Das Ziel dieser Linie war, Kombinationen von Länge größer als 2 zu erstellen.

+1

Es wäre nützlich, wenn Sie teilen könnten der Code, den Sie tatsächlich haben – oScarDiAnno

+0

Ich kann dieses Problem nicht replizieren. Mit 'list (combinations ([str (x) für x im Bereich (8,11)], 2)) ergibt sich das erwartete Ergebnis von [[('8', '9'), ('8', '10 '), (' 9 ',' 10 ')] ' – James

+0

Das Posten eines Bildes ist schlecht juju. Sollen wir es erneut eingeben, um es zu versuchen ??? cut-n-paste! –

Antwort

2

itertools.combinations funktioniert ordnungsgemäß. Sie brechen das Ergebnis mit cell = tuple(set(i[0]+i[1])). Das fügt die zwei Zeichenfolgen hinzu (z. B. '910') und zerlegt dann die Ziffern. i hat das korrekte Ergebnis für dieses Beispiel ('9','10').

+0

Danke! Das hat es behoben. –

1

Nicht sicher, ob Sie es richtig verwenden. Ich nehme an, Sie etwas entlang der Linien von

from itertools import combinations 

a = [str(i) for i in range(11)] 
print(list(combinations(a, 2))) 

In diesem Fall versuchen, die Zeichenfolge ‚10‘ nicht in ‚1‘ gebrochen und ‚0‘. Die Ausgabe hat 55 Werte einschließlich ('0', '10'), ('1', '10') ... ('9', '10')

+0

Nicht sicher, warum diese Antwort abgelehnt wurde, Lösung sieht gut aus! – alfasin

Verwandte Themen