2016-04-16 2 views
0

Der folgende Code betrachtet eine Liste von tuple s (jeweils mit zwei Elementen) namens Paare, und erstellt eine Bank aller Elementnamen in der Liste. Es zählt dann, wie oft ein Element in einem tuple erscheint und teilt dieses durch eine Anzahl von Elementen. Ich möchte die durchschnittliche Anzahl der Interaktionen (mal in einem Tupel mit einem anderen Element) pro Element für die gesamte list.Pythonic Träume: durchschnittliche Anzahl der Erscheinungen des Elements in der Liste der Tupel

def average(pairs): 
    intcount = 0 
    bank = [] 
    for j,k in pairs: 
     if not j in bank: 
      bank.append(j) 
     if not k in bank: 
      bank.append(k) 
     if j in bank: 
      intcount += 1 
     if k in bank: 
      intcount += 1 
    output = intcount/len(bank) 
    return output 

Der Code funktioniert gut, ist aber ein Schandfleck. Ich versuche zu lernen, mehr Python Code zu schreiben, aber jedes Mal wenn ich versuche, meinen Code in weniger Zeilen zu verdichten, wird es falsch. Ein Beispiel für meine abgründigen Versuch:

def average(pairs): 
    intcount = 0 
    bank = [] 
    if not j or k in bank for j,k in pairs: 
     bank.append(if not j in bank else k if not k in bank else ' ' for j, k in interactions) 
    #then some kind of line streamlining how the intcount increments? 
+0

der Code ist nicht so schlecht, aber Sie können die 3. und 4. if-Anweisungen nicht trivial kombinieren, und es gibt keinen Grund, eine Ausgabevariable zu definieren, nur die rechte Seite davon zurückgeben. – Natecat

+0

Wie würden die 3. und 4. if-Anweisungen aussehen, wenn kombiniert? Wenn ich j oder k in eine if-Anweisung setze, wobei der intcount inkrementiert wird, zählt es nur j, es sei denn, ich gebe k in seine eigene Anweisung ein. (Entschuldigung, ich konnte nicht herausfinden, wie man den Code in den Kommentaren zum arbeiten bringt ....: /) – Ouwan12

+0

Wahrscheinlich verstehst du den Operator-Vorrang nicht vollständig. Ich vermute, Sie machen so etwas wie 'if j oder k in bank'. Python ist nicht englisch, und Sie können es nicht wie Englisch behandeln. Dieser Code prüft, ob j nicht Null ist, oder k ist in der Bank, nicht wenn entweder j oder k in der Bank ist. Sie wollen tatsächlich etwas wie "wenn j in Bank oder k in Bank – Natecat

Antwort

1

Sie können eine set verwenden.

def average(pairs): 
    bank, intcount = set(), 0 
    for j, k in pairs: 
     bank.update({j, k}) 
     intcount += 1 if j in bank or k in bank 
    return intcount/len(bank) 
+0

" 1 wenn j in Bank oder k in Bank sonst 0 "einfach" j in Bank oder k in Bank "sein kann. – TigerhawkT3

+0

Guter Punkt, danke. – Signal

+0

Hmm das scheint 1/2 des Durchschnitts wiederzugeben, der wahr ist. Eine Beispieldatei, die ich erstellt habe, sollte den Durchschnitt als 4.2 zurückgeben, aber dieser Code gibt 2.1 zurück. Etwas über die Erhöhung der Anzahl ist funky? – Ouwan12

0

Probieren Sie diese zwei Linien

pairs = [(1,2), (2,3), (3,4), (4,5)] 
bank = set(i for pair in pairs for i in pair) # {1, 2, 3, 4, 5} 
output = 2*len(pairs)/len(bank) # 1.6 
In [288]: output 
Out[288]: 1.6 
In [289]: average(pairs) # your function 
Out[289]: 1.6 

Prüfen Sie, ob es für Sie arbeitet.