2

エントリが次のタプルの入力リストがあります。

input_1 = [('v1',['f1','f2','f3']),('v2',['f1','f2','f4']),('v3',['f1','f2','f4'])]
                  ^^^^^^^^^               ^^^^^^^^^               ^^^^^^^^^

次のような「グループ」を含むタプルのリストを取得する方法があるかどうかを知りたいです。

output_1 = [(['f1','f2'],['v1','v2','v3']) , (['f3'],['v1']), (['f4'],['v2','v3'])]

十分な情報がない場合、他の入力/出力は次のようになります。

input_2 = [('v1',['f1']),('v2',['f2','f3']),('v3',['f4'])]

output_2 = [(['f1'],['v1']) , (['f2','f3'],['v2']), (['f4'],['v3'])]

また

input_3 = [('v1',['f1','f2']),('v2',['f1','f2']),('v3',['f3']),('v4',['f1','f2'])]
                  ^^^^^^^^^          ^^^^^^^^^                        ^^^^^^^^^

output_3 = [(['f1','f2'],['v1','v2','v4']) , (['f3'],['v3'])]

辞書を実装することでこれを達成する方法があると思いますが、私はPythonを初めて使用するので、これまでに見た例からこれを行う方法がわかりません:

Python でのセット メンバーシップによる整数のグループ化

リスト内のすべての辞書に同じキーがあることを確認してください

たくさんの for ループを使って非効率的にこれを行うことができたと思いますが、pythonic またはクリーンな代替手段はありますか? この質問が適切に提起されていない場合は申し訳ありませんが、ご意見をお寄せいただきありがとうございます。

4

1 に答える 1

4

両方のレベルを反復処理してから、レベルを反転させて入力を再構築できます。それはあなたをほとんどの方法で取得します。v主な問題は、 を共有する をどのようにグループ化するかということですf...ティムが提案するのと同じ結果をもたらす可能性のあるさまざまな順列があります。

異なる出力グループ順列...どちらがより有効ですか?

とにかく:これは始まりです。

from collections import defaultdict

input_1 = [('v1',['f1','f2','f3']),
           ('v2',['f1','f2','f4']),
           ('v3',['f1','f2','f4'])]
input_2 = [('v1',['f1']),
           ('v2',['f2','f3']),
           ('v3',['f4'])]
input_3 = [('v1',['f1','f2']),
           ('v2',['f1','f2']),
           ('v3',['f3']),
           ('v4',['f1','f2'])]

def group(inp):
    out = defaultdict(list)
    for group in inp:
        key = group[0]
        for entry in group[1]:
            out[entry].append(key)
    return dict(out)

出力は次のようになります。

print group(input_1)
# {'f1': ['v1', 'v2', 'v3'], 
#  'f2': ['v1', 'v2', 'v3'], 
#  'f3': ['v1'], 
#  'f4': ['v2', 'v3']}
print group(input_2)
# {'f1': ['v1'], 
#  'f2': ['v2'], 
#  'f3': ['v2'], 
#  'f4': ['v3']}
print group(input_3)
# {'f1': ['v1', 'v2', 'v4'], 
#  'f2': ['v1', 'v2', 'v4'], 
#  'f3': ['v3']}
于 2013-09-12T05:16:24.053 に答える