tuple を要素に持つ set を、各 tuple の第一引数で分けてリストにまとめる方法


まず以下のような辞書型があったとします。

[code]

    xdic={sub1:{(0,A),(1,C),(0,B),(1,D)}, sub2:{(0,A),(2,C),(1,B),(3,D)}}
    
[/code]

これを(key毎に)値の第一引数で分け、key名を先頭にしたリストにまとめる方法が分かりません。

つまり

key:sub1について  
0を引数にまとめる:`(sub1,A,B)`  
1を引数にまとめる:`(sub1,C,D)`

key:sub2について  
0を引数にまとめる:`(sub2,A)`  
1を引数にまとめる:`(sub2,B)`  
2を引数にまとめる:`(sub2,C)`  
3を引数にまとめる:`(sub2,D)`

この様なアウトプットを求めています。

環境はpython2.7です。分かる方何卒宜しくお願いいたします。




素直にループで回す例です。

[code]

    #!/usr/bin/python2
    #coding: utf-8
    from __future__ import print_function
    
    xdic = {
            'sub1': {(0, 'A'), (0, 'B'), (1, 'C'), (1, 'D')},
            'sub2': {(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D')},
            }
    
    
    def dic_per_first_item(pre, collection):
        result = {}
        for v in collection:
            first_item = v[0]
            if first_item not in result:
                result[first_item] = [pre]
    
            # 値のタブルが2要素と決っているなら、以下のループは必要ないです
            # result[first_item].append(v[1]) のような形でよいです
            rest_items = v[1:]
            for i in rest_items:
                result[first_item].append(i)
    
        return result
    
    
    for key, value in xdic.items():
        print("about:", key)
        for k, v in dic_per_first_item(key, value).items():
            print(k, ":", v)
    
[/code]

出力:

[code]

    about: sub2
    0 : ['sub2', 'A']
    1 : ['sub2', 'B']
    2 : ['sub2', 'C']
    3 : ['sub2', 'D']
    about: sub1
    0 : ['sub1', 'B', 'A']
    1 : ['sub1', 'C', 'D']
    
[/code]

* * *

少し質問を編集で直しておこうかと思った点があるのですが、タイミングにより、他の方の回答と齟齬が出るかも知れないので止めました。  
以下がそれです。

> 辞書型の値がリストで与えられてる

とされていますが、この（`xdic`に代入されている）辞書の値は`[ ]`でなく`{
}`で囲まれていますので、リストではなく[set（集合）](http://docs.python.jp/2.7/library/stdtypes.html#set-
set-frozenset)になっています。  
今回の目的に沿っていればそれで構いませんが、順序が無かったりしますので気を付けて下さい。  
回答のアウトプットを見ると分かりますが、順序は不定です。

> リストにまとめる

結果の形として、`(sub1,A,B)`を示されていますが、これも`[ ]`でなく`( )`で囲まれていますので、リストにはならず、タブルになります。  
（これはPythonの値の表現ではなく疑似コードとして示されたのかもしれませんが。）  
回答ではリストに変更しました。

> 値の第一引数

という言葉ですが、これは関数に渡すものを指すのに使われます（[引数](https://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0)）。  
リストなどの中身の要素を指す場合は、そのまま「リストの要素」とするとよいです。  
「第一引数」ではなく、「最初の要素」などと呼びます。

>
[code]

>     xdic={sub1:{(0,A),(1,C),(0,B),(1,D)}, sub2:{(0,A),(2,C),(1,B),(3,D)}}
>  
[/code]

の中にある、`sub1`、`sub2l`、`A`、などといった変数はプログラムの中で、適切な値を設定されていることと思いますが、コードの断片を示す場合は、可能な限り独立して動くコードにすると伝わり易いです。  
今回の場合、全て定数（文字列）にしても質問の本旨に影響ないと思います。  
回答では文字列にしました。

* * *

追記:  
他の方が一部直して下さいましたね。  
上記は最初のバージョンに関してのコメント、という事でお願いします。

