2

だから私はこれらのタプルを別のタプルの2つのリストに入れています

data_tuple = ([(1,2,3),(4,5,6)(7,8,9)],[(a,b,c),(d,e,f)(g,h,i)])

各リストの対応するインデックス付き要素を使用して座標のセットを作成したいので、次のようになります。

final = [(2,b),(5,e),(8,h)]

これが私が得たものです:

for a in data_tuple[0]:
    x = a[1]
    for b in data_tuple[1]:
        y = b[1]
        print(x,y)

今のところ、反復/インデントが正しいかどうかを確認したいので、まだリストに入れる必要はありません。現在、この特定のコードの結果は次のとおりです。

(2,b)
(2,e)
(2,h)
(5,b)
(5,e)

(8、h)に達するまで続けます。

印刷行を左に移動すると、2番目のforループの下に次のようになります。

(2,h)
(5,h)
(8,h)

これを修正するにはどうすればよいですか?意味がわからない場合は申し訳ありません=/。お分かりのように、私はPythonに非常に慣れていないため、多くのインポートモジュールに精通していません。何か助けてください?

4

3 に答える 3

2
>>> print [(i[0][1],i[1][1]) for i in zip(*data_tuple)]
[(2, 'b'), (5, 'e'), (8, 'h')]

しかし、多くの場合、簡潔さよりも明確さが重要です

インデントと反復が正常であることを意味する意図したとおりに機能しているように見えるため、元の質問を本当に理解していません。

[編集]これはあなたが私が思うものです

for i in range(len(data_tuple[0]):
    x,y = data_tuple[0][i][1],data_tuple[1][i][1],
    print (x,y)

また

>>> for numbr,letr in zip(*data_tuple):
...     x,y = numbr[1],letr[1]
...     print(x,y)
...
于 2012-09-07T00:18:41.460 に答える
0

このようなもの?

>>> data_tuple = ([(1,2,3),(4,5,6),(7,8,9)],[("a","b","c"),("d","e","f"),("g","h","i")])
>>> full_numbers_list, full_letters_list = data_tuple
>>> desired_output_idx = (1,)
>>>
>>> results = []
>>> for numbers, letters in zip(full_numbers_list, full_letters_list):
...     assert len(numbers) == len(letters) # make sure assumption is met
...     for i in range(len(numbers)): 
...         if i in desired_output_idx:
...             results.append((numbers[i], letters[i]))
...
>>> results
[(2, 'b'), (5, 'e'), (8, 'h')]

解凍の手順を使用する代わりに、関数への入力のためにタプルを解凍するをdata_tuple使用できます。*data_tuplezip()

>>> zip(*data_tuple)
[((1, 2, 3), ('a', 'b', 'c')), ((4, 5, 6), ('d', 'e', 'f')), ((7, 8, 9), ('g', 'h', 'i'))]
>>>
>>> # *data_tuple is the same as:
>>> numbers, letters = data_tuple
>>> zip(numbers, letters)
[((1, 2, 3), ('a', 'b', 'c')), ((4, 5, 6), ('d', 'e', 'f')), ((7, 8, 9), ('g', 'h', 'i'))]
于 2012-09-07T00:35:02.323 に答える
0

常に2番目の要素が必要であると仮定します。

[ (a, b) for ((_,a,_), (_,b,_)) in zip(*data_tuple) ]

これにより、指定した結果が生成されますが、デカルト積を生成するアルゴリズムと同じではないことに注意してください。これはこうして達成されるでしょう:

[ (a, b)
  for (_,a,_) in data_tuple[0]
  for (_,b,_) in data_tuple[1] ]

常に2番目の要素が必要であると仮定します。

[ (a, b) for ((_,a,_), (_,b,_)) in zip(*data_tuple) ]

これにより、指定した結果が生成されますが、デカルト積を生成するアルゴリズムと同じではないことに注意してください。これはこうして達成されるでしょう:

[ (a, b)
  for (_,a,_) in data_tuple[0]
  for (_,b,_) in data_tuple[1] ]

編集:あなたのコメントに応えて、これが私が実行したセッションです:

>>> [ (a, b)
...   for (_,a,_) in data_tuple[0]
...   for (_,b,_) in data_tuple[1] ]
[(2, 'b'), (2, 'e'), (2, 'h'), (5, 'b'), (5, 'e'), (5, 'h'), (8, 'b'), (8, 'e'), (8, 'h')]

これは、元のコードによるデカルト積です。

ただし、修正された質問に基づいて、私が提示した最初のコードが必要なだけだと確信しています。

>>> [ (a, b) for ((_,a,_), (_,b,_)) in zip(*data_tuple) ]
[(2, 'b'), (5, 'e'), (8, 'h')]
于 2012-09-07T00:39:29.773 に答える