2

ある点までは似ているが、ドットの後に数字が異なるアイテムのリストがあるとしましょう

['abc.1',
 'abc.2',
 'abc.3',
 'abc.7',
 'xyz.1',
 'xyz.3',
 'xyz.11',
 'ghj.1',
 'thj.1']

このリストから、倍数を折りたたむが、データの一部、つまり数字のサフィックスを保持する新しいリストを作成したいので、上記のリストは新しいリストを作成する必要があります

[('abc',('1','2','3','7'))
 ('xyz',('1','3','11'))
 ('ghj',('1'))
 ('thj',('1'))]

私が考えたのは、最初のリストはドットでペアに分割できるということですが、2番目の部分を失うことなく最初の部分でペアをグループ化する方法

この質問がお粗末な場合は申し訳ありませんが、事前に感謝します

...うわー、私はそれほど多くの素晴らしい答えをそれほど速く期待していませんでした、ありがとう

4

2 に答える 2

5
from collections import defaultdict

d = defaultdict(list)

for el in elements:
    key, nr = el.split(".")
    d[key].append(nr)

#revert dict to list
newlist = d.items()
于 2012-09-03T18:32:09.850 に答える
1

リストをセパレーター関数でマップしitertools.groupby、最初の要素を取得するキーで使用し、2 番目の要素を結果に収集します。

from itertools import groupby, imap

list1 = ["abc.1", "abc.2", "abc.3", "abc.7", "xyz.1", "xyz.3", "xyz.11", "ghj.1", "thj.1"]

def break_up(s):
    a, b = s.split(".")
    return a, int(b)

def prefix(broken_up): return broken_up[0]
def suffix(broken_up): return broken_up[1]

result = []
for key, sub in groupby(imap(break_up, list1), prefix):
    result.append((key, tuple(imap(suffix, sub))))

print result

出力:

[('abc', (1, 2, 3, 7)), ('xyz', (1, 3, 11)), ('ghj', (1,)), ('thj', (1,))]
于 2012-09-03T18:39:43.543 に答える