2016-04-16 15 views
0

以下のコードは、ペアと呼ばれるtuple(それぞれが2つの要素)のリストを調べ、リスト内のすべての要素名のバンクを作成します。次に、tupleに何番目の要素が何回現れたかを数え、いくつかの要素で除算します。私は、list全体に対して要素あたりの平均相互作用数(別の要素を含むタプルに現れる時間)を求めます。pythonic dreams:タプルリスト内の要素の平均出現回数

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 

コードはうまく動作しますが、目障りです。より多くのpythonコードを書く方法を学ぼうとしていますが、私のコードをいくつかの行に集約しようとするたびに間違ってしまいます。私の最悪の試みの例は:

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

コードはそれほど悪くはありませんが、3番目と4番目のif文を単純に組み合わせることはできますが、出力変数を定義する理由はありません。 – Natecat

+0

3番目と4番目のif文はどのように見えますか? intcountをインクリメントしてif文にjまたはkを入れると、kをそれ自身の文に入れない限り、jだけがカウントされます。 (申し訳ありませんが、コメント内でコードを動作させる方法を理解できませんでした....)// – Ouwan12

+0

おそらく、演算子の優先順位を完全に理解できません。私の推測では、 '' jかk in bank'のようなことをしているのですか?Pythonは英語ではなく、英語のように扱うことはできません。このコードは、jが0でないか、またはkがバンクにあるかどうかをテストします.jまたはkのいずれかがバンクにない場合はテストしません。あなたは実際に '銀行のjか銀行のkの場合は' – Natecat

答えて

1

あなたはsetを使用することができます。

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、銀行のj、銀行の他の0のkは単に' j in bank 'や 'k in bank'のようにしたいと思っています。 – TigerhawkT3

+0

良い点、ありがとう。 – Signal

+0

これは本当の平均の1/2を返すようです。私が作成したファイルの例は平均を4.2として返すべきですが、このコードは2.1を返します。 intcountの増分についての何かがファンキーですか? – Ouwan12

0

それはあなたのために働くかどうかを確認し、これらの二行

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 

を試してみてください。

関連する問題