2016-08-12 12 views
2

私は比較的新しいPythonを使用しており、次の作業を行うのに苦労しています。現在、私はタプルのリストを持っています(list_oneより大きいこれらのタプル内の要素は1です)タプルと2)文字列(これらの文字列は常に'A'または'B'の2つの値のいずれかです('D'タプルのリストからタプル要素を結合する。タプル要素はタプルとリストです

:私は次のように見える新しいリストを作成するには、失敗し、しようとしている

list_one = [(('id1', ['v1', 'v2']), 'A'), (('id2', ['v3', 'v4', 'v5', 'v6']), 'A'), (('id3', ['v11']), 'B'), (('id4', ['v12', 'v13']), 'B'), (('id5', ['v14', 'v16']), 'B'), (('id6', ['v17', 'v18', 'v21']), 'A')] 

:または'Z'、または任意の他の二つの文字列)の内側タプルは'id'と値(文字列)のlistが含まれます

new_list1 = [('id1',['v1', 'v2', 'v3', 'v4', 'v5', 'v6']), ('id3',['v11', 'v12', 'v13', 'v14', 'v16']), ('id6',['v17', 'v18', 'v21'])] 

文字列の値(A、B)が変更されると、最初の要素がA、Bが変更される最初の要素のIDであり、2番目の要素が初期リスト内の値( "v")のリストである新しいタプルを作成する必要があります。辞書が有効な場合のリスト:

new_list2 = [{'id1': ['v1','v2', 'v3', 'v4', 'v5', 'v6']}, {'id3':['v11', 'v12', 'v13', 'v14', 'v16']}, {'id6':['v17', 'v18', 'v21']}] 

どのようなガイダンスもありがとうございます。

編集:

s = list_one[0][1] 
for tup in list_one: 
    if s in tup: 
     new_list.extend(tup[0][1]) 
    else: 
     new_list.append(tup[0][1]) 

が与える:

これは "のリストで、1「」値の周りのリストを作成して、私が探しているものを実際にはない
['v1', 'v2', 'v3', 'v4', 'v5', 'v6', ['v11'], ['v12', 'v13'], ['v14', 'v16'], 'v17', 'v18', 'v21'] 

B '内部にある。

+2

私たちにあなたのコードを表示してください... –

+1

Welcome to Stackoverflow!状態を正確に記入してください:a)あなたがこれまでに試していることは何ですか?(**完全な証明可能な例**を表示してください)b)どこがつまっていますか? – SuperSaiyan

+0

ああ、ちょうどあなたのコメントを見ました。ありがとうSuperSaiyan;)正直言って、私はこの特定の問題をどう扱うかについては全くわかりません。私は多くのことを試しました。メインポストの編集。非常に難しい問題のようには見えませんが、どういうわけか、1)同じリスト内に同じ「id」を持つ隣接する「v」を取得してから、新しいリストを作成する2番目の「id」の「v」が付いています。 – PDavis

答えて

1

基本的には、現在の鍵(Noneに初期化されている)が何であるかを覚えておいてループすることができます。

key = None # This is 'A' or 'B' in your example, but it starts off as None 
new_list = [] # This holds the final result 
for r, l in [(r, l) for (l, r) in list_one]: 
    if r != key: # If the current is not the key, time to switch to a new one 
     id_ = l[0] 
     new_list.append({id_: []}) 
    new_list[-1][id_].extend(l[1]) # Extend the current list 
    key = r # Make it the current key in any case. 

>>> new_list 
[{'id1': ['v1', 'v2', 'v3', 'v4', 'v5', 'v6']}, 
{'id3': ['v11', 'v12', 'v13', 'v14', 'v16']}, 
{'id6': ['v17', 'v18', 'v21']}] 
+0

id1とid6のリストは同じ文字Aを持っているので、リストは最初のid(id1)がtpl_listで満たされています(私が理解する限り)。私のアウト: {'id3':['v11'、 'v12'、 'v13'、 'v14'、 'v16']、 'id1':['v1'、 'v2'、 'v3'、 'v4 '、' v5 '、' v6 '、' v17 '、' v18 '、' v21 ']} –

+0

@MiroRodozov「文字列値(A、B)が変更されたときに、新しいタプルを作成する必要があります。また、これはOPが問題にした例とまったく同じです。しかし、あなたのようには見えません。 –

+0

私は彼の望みの結果を見ています。あなたは正しい説明に正確に合っています。とにかく、主キーが文字1でなければならないと理解していると言っています。利用される。とにかく、それはおそらく私がそれを工夫したことでした –

1

編集

これは'A''B'値に対応する全てのリストが集約される関連する問題を解決し、そしてIDは各グループの合計最初のIDを選んだされています。ここで


あなたはここで行われている何

letterKeyToFirstIDMap = {} 
result_dict = {} 

for tpl in list_one: 

    id = tpl[0][0] 
    lst = tpl[0][1] 
    letter_id = tpl[1] 
    if not letter_id in letterKeyToFirstIDMap: 
    letterKeyToFirstIDMap.update({letter_id: id}) 
    result_dict.update({id:[]}) 

    result_dict[letterKeyToFirstIDMap[letter_id]] += lst 

print result_dict 

を行って、各文字キー(Aと言う)のためにあなたが満たされた最初のIDが(たとえばID1)のための鍵になりたいということです以下のリスト。最初にペアが表示されたときに、letterKeyとそのidKeyを格納するマップを作成し、対応するidKeyを使用してそのマップに文字キーがすでに存在するかどうかを確認し、リストを更新します。

+0

以下の例の出力をチェックしてください。「私は、失敗したように、次のような新しいリストを作成しようとしています。私はあなたがそれを出力しているかどうかはわかりません(この場合、すべてを2つのリストに結合するようです)。 –

+0

質問は少し難しかったし、関連する質問を解決したので、私はこれをアップしている。 –

関連する問題