2011-10-09 8 views
4

私は配列を持っている:x = [ [1, 2], 1, 1, [2, 1, [1, 2]] ] いる私は数1のすべての発生をカウントし、変数one_counterにその番号を保存したいです。 x.count(1)は、1の2回だけを返します。これは不十分です。

下のコードは5にありますが、one_counterに保存されていますが、目立たず、私には気に入らないと感じています。

どのように私はpythonicityを改善し、より多くの次元のリストにそれを拡大することができますか?

ありがとうございます!簡潔パイソン - 混合配列内の値の各発生を見つける(整数、リスト)

def flatten_count(iterable, element): 
    count = 0 
    for item in iterable: 
     if item == element: 
      count += 1 
     if isinstance(item, list): 
      count += flatten_count(item, element) 
    return count 

以上:

>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 
>>> print(flatten_count(x, 1)) 
5 
+1

スケールはこれと何が関係していますか? –

+0

@ IgnacioVazquez-Abrams私は彼がScaleという言葉を使いすぎたと思う。 – DhruvPathak

+0

@DhruvPathakはい、サー!私はスケールのためにそれを誤解しました。 –

答えて

8

文字列に: http://codepad.org/vNEv6B8M

import re 
x = [ [1, 2], 1, 1, [2, 1, [1, 2]] ] 
nums = [int(i) for i in re.findall(r'\d+', str(x))] 
print(nums.count(1)) 
+0

ありがとう、Mark!それは完璧な意味合いがあり、今はisinstance()という便利さと一緒に再帰をよく理解しています。 –

3

ハックソリューション、データ型の変換によって働く:このような

def flatten_count(iterable, element): 
    return sum(
     flatten_count(item, element) if isinstance(item, list) else item == element 
     for item in iterable 
    ) 

使用あなたは再帰を使用することができ

x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 

one_counter = 0 

for i in x: 
    if type(i) == list: 
     for j in i: 
      if type(j) == list: 
       for k in j: 
        if k == 1: 
         one_counter += 1 

      else: 
       if j == 1: 
        one_counter += 1 

    else: 
     if i == 1: 
      one_counter += 1 
2

私はそれが2つの部分にこのタスクを分離する方が良いと思います。

第1

パート1は、入力されたリストを平らにしますジェネレータを作成することです。

def flatten_list(L): 
    for i in L: 
     if isinstance(i,list): 
      for j in flatten_list(i): 
       yield j 
     else: 
      yield i 

出力のテスト:

x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 

for i in flatten_list(x): 
    print i 

出力:パート2に1の出現回数をカウントするように平坦化リストを使用することで2

1 
2 
1 
1 
2 
1 
1 
2 

パートそれ:

print(sum(i==1 for i in flatten_list(x))) 

出力:

5 

i==1戻りTruei=1場合、およびFalsei1と等しくない場合に。しかし、True1に等しく、False0に等しいので、sumはちょうどTrueオカレンスの数を計算します(これは5に等しい)。

+0

それを分解していただきありがとうございます。ほんとうにありがとう。 –

関連する問題