1

次の形式のリストがあります。

['CASE_1:a','CASE_1:b','CASE_1:c','CASE_1:d',
 'CASE_2:e','CASE_2:f','CASE_2:g','CASE_2:h']

次のような新しいリストを作成したいと思います。

['CASE_1:a,b,c,d','CASE_2:e,f,g,h']

これをエレガントに行う方法はありますか??

4

4 に答える 4

2

これは宿題だと気づいたので、完全なソリューションを削除しましたが、基本的な考え方は次のとおりです。

辞書はより優れたデータ構造です。私はcollections.defaultdict. 例えば

yourdict = defaultdict(list)

リストを反復処理できます (各要素を分割します':')。何かのようなもの:

#only split string once -- resulting in a list of length 2.
case, value = element.split(':',1) 

.append次に、listメソッドを使用してこれらを dict に追加できます。

yourdict[case].append(value)

Case_1これで、キー ( 、Case_2) をリスト ( ) にマップする dict ができました['a','b','c','d'], [...]

本当にリストが必要な場合は、辞書の項目を並べ替えて、適切に結合できます。


ため息。宿題タグが削除されたようです(これが私の元の解決策です):

from collections import defaultdict
d = defaultdict(list)
for elem in yourlist:
   case, value = elem.split(':', 1)
   d[case].append(value)

これで、上で説明した辞書ができました。本当にリストを取り戻したい場合:

new_lst = [ case+':'+','.join(values) for case,values in sorted(d.items()) ]
于 2012-09-13T14:46:37.810 に答える
2

ケースをキーとして扱い、各文字をリストに追加することで a を使用できますdefaultdict。ケースと文字は、次のようにリストの要素を分割することによって取得されます':'

from collections import defaultdict

case_letters = defaultdict(list)
start = ['CASE_1:a','CASE_1:b','CASE_1:c','CASE_1:d', 'CASE_2:e','CASE_2:f','CASE_2:g','CASE_2:h']
for el in start:
    case, letter = el.split(':')
    case_letters[case].append(letter)
result = sorted('{case}:{letters}'.format(case=key, letters=','.join(values)) for key, values in case_letters.iteritems())
print result

これは宿題なので ( edit: or was!!?collections.defaultdict ) - , str.split(およびその他の組み込み文字列メソッド) を組み込み型listとそのメソッド ( append,など...) でextend見ることをお勧めします, , 組み込みメソッドと一般的に一般的に。ここにある実際の例と最終的なマニュアルを参照用に使用してください。これらはすべて後で役に立ちます。できる限り理解することをお勧めします。sortstr.formatsorteddict

考慮すべきもう1つのことは、次のようなものがあることです。

{1: ['a', 'b', 'c', 'd'], 2: ['e', 'f', 'g', 'h']}

は、はるかに便利な形式であり、後で目的のリストを再作成するために使用できます...

于 2012-09-13T14:52:11.843 に答える
0
data = ['CASE_1:a','CASE_1:b','CASE_1:c','CASE_1:d', 'CASE_2:e','CASE_2:f','CASE_2:g','CASE_2:h']

output = {}

for item in data:
    key, value = item.split(':')
    if key not in output:
        output[key] = []
    output[key].append(value)

result = []
for key, values in output.items():
    result.append('%s:%s' % (key, ",".join(values)))


print result

出力

['CASE_2:e,f,g,h', 'CASE_1:a,b,c,d']
于 2012-09-13T14:49:37.010 に答える
0
mydict = {}
for item in list:
    key,value = item.split(":")
    if key in mydict:
        mydict[key].append(value)
    else:
        mydict[key] = [value]
[key + ":" + ",".join(value) for key, value in mydict.iteritems()]

正直なところ、あまりエレガントではありません。ご存知のように、実際には辞書として動作するため、リストを辞書として保存します。

出力は['CASE_2:e,f,g,h', 'CASE_1:a,b,c,d']

于 2012-09-13T14:53:04.970 に答える