2016-12-11 7 views
3

私は文字列と別のリストを含むタプルのリストを持っています。次のようにそれがある:文字列とリストを含むタプルのリストをトラバースして、

board = [('10S', []), ('3H', []), ('6C', ['KS', '9C']), ('6H', []), ('7D', []), ('9S', ['AS', 'KS'])] 

私は次のように比較が行われるようにトラバースしたい:

10S 3H 
3H 6C 
6C KS 
6C 9C 
6C 6H 
6H 7D 

のように... get_mapping()は以下の書かれ

を呼び出します。 prev2およびprev1の値。

私は、次のコードを実装している:

for val in board: 
    print "Val is: " + str(val) 
    if cnt == 0: 
     prev2 = val[0][0] 
     prev1 = val[1][0] 
     cnt += 1 
     get_mapping(prev2,prev1,True) 
    else: 
     prev2 = prev1 
     if len(val[1]) > 0: 
      for v in val[1]: 
       prev1 = v 
       cnt += 1 
       get_mapping(prev2,prev1,False) 
     else: 
      prev1 = val[0] 
      cnt += 1 
      get_mapping(prev2,prev1,True)  

は、私が最初の条件が間違っている知っています。私は比較のために横断する方法についてちょっと固まっている。どんな助けもありがとう。

答えて

4

あなたはペアをもたらすジェネレータを書くことができます:

from itertools import zip_longest 

master_board_state = [('10S', []), ('3H', []), ('6C', ['KS', '9C']), 
         ('6H', []), ('7D', []), ('9S', ['AS', 'KS'])] 

def pairs(state): 
    for (key, lst), nxt in zip_longest(state, state[1:]): 
     yield from ((key, x) for x in lst) 
     if nxt is not None: 
      yield key, nxt[0] 

print('\n'.join(str(p) for p in pairs(master_board_state))) 

出力:上記zip_longest

('10S', '3H') 
('3H', '6C') 
('6C', 'KS') 
('6C', '9C') 
('6C', '6H') 
('6H', '7D') 
('7D', '9S') 
('9S', 'AS') 
('9S', 'KS') 

はペアとしてstateからアイテムを得られます。最初のパラメータは最後の繰り返しで2番目のパラメータよりも長いため、Noneがfillvalueとして使用されます。次に、ループは(key, list item)タプルを返す最初のyield fromジェネレータを生成し、最後に現在と次のキーを生成します。

from itertools import izip_longest 

master_board_state = [('10S', []), ('3H', []), ('6C', ['KS', '9C']), 
         ('6H', []), ('7D', []), ('9S', ['AS', 'KS'])] 

def pairs(state): 
    for (key, lst), nxt in izip_longest(state, state[1:]): 
     for x in lst: 
      yield key, x 
     if nxt is not None: 
      yield key, nxt[0] 

print '\n'.join(str(p) for p in pairs(master_board_state)) 
+0

この行に誤りがあります。「無効な構文です」と私に言っているのは、((key、x)for x)です。 – hshantanu

+0

@hshantanuあなたは 'yield from'や' zip_longest'を持たないPython 2をおそらく使用しています。 Python 2バージョンの更新された答えを見てください。 – niemmi

+0

助けてくれてありがとう。できます。 – hshantanu

3

だから、これは介して行うことができますトラバーサルの非常に特定の種類は、次のとおりです。izip_longestとしてそれはyield fromzip_longestが知られていないため

のPython 2軽微な変更のアップデートが必要とされていますジェネレータ。

更新:最初は複雑なジェネレータ表現で試しましたが、尾を見逃してしまったので、@niemmiに似たジェネレータ関数になってしまいましたが、やや異なるアプローチでした。

from itertools import tee 

# from itertools recipes 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 

def pairs(d): 
    for (a, x), (b, y) in pairwise(d): 
     yield from ((a, n) for n in x) 
     yield a, b 
    yield from ((b, n) for n in y) 

>>> list(pairs(board)) 
[('10S', '3H'), 
('3H', '6C'), 
('6C', 'KS'), 
('6C', '9C'), 
('6C', '6H'), 
('6H', '7D'), 
('7D', '9S'), 
('9S', 'AS'), 
('9S', 'KS')] 
+0

Python 2では少し修正が必要ですが、良い答えですが、 'yield from'はPython 2では機能しません。 – hshantanu

+1

確かに、 'yield from ...'を 'for i in ... ...:yield私は。 – AChampion

関連する問題