4
input: ['abc', 'cab', 'cafe', 'face', 'goo']
output: [['abc', 'cab'], ['cafe', 'face'], ['goo']]

問題は単純です: anagramsでグループ化します。順番は関係ありません。

もちろん、これは C++ (私の母国語) で行うことができます。しかし、これはPythonによって1 行で実行できるのではないかと思います。EDITED:それが不可能な場合は、おそらく2行または3行です。私はPythonの初心者です。

2 つの文字列がアナグラムかどうかを確認するために、並べ替えを使用しました。

>>> input = ['abc', 'cab', 'cafe', 'face', 'goo']
>>> input2 = [''.join(sorted(x)) for x in input]
>>> input2
['abc', 'abc', 'acef', 'acef', 'goo']

組み合わせなどで可能かと思いますmap。しかし、dictハッシュテーブルとして a を使用する必要があります。これが1行で実行できるかどうかはまだわかりません。どんなヒントでも大歓迎です!

4

7 に答える 7

9

読みやすい 1 行のソリューション:

output = [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]

例えば:

>>> words = ['abc', 'cab', 'cafe', 'goo', 'face']
>>> from itertools import groupby
>>> [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]
[['abc', 'cab'], ['cafe', 'face'], ['goo']]

ここで重要なことは、リスト内のアイテムをグループ化itertools.groupbyするitertoolsモジュールから使用することです。

提供するリストはgroupby事前にソートする必要があるため、それを渡しますsorted(words,key=sorted)。ここでのトリックはsorted、キー関数を取り、この関数からの出力に基づいてソートすることです。そのため、sortedキー関数として再度渡すと、文字列の文字を使用して単語が順番にソートされます。独自の関数を定義したり、lambda.

groupbyアイテムをグループ化する必要があるかどうかを伝えるために使用するキー関数を受け取り、組み込み関数に渡すことができsortedます。

最後に、出力はキー オブジェクトとグループ オブジェクトのペアであるため、グルーパー オブジェクトを取得し、list関数を使用してそれぞれをリストに変換するだけです。

(ところで-組み込み関数inputを非表示にするために変数を呼び出すことはありませんが、おそらく使用する必要はありません。)input

于 2011-11-18T11:38:03.497 に答える
3

読めない一行の解決策:

>>> import itertools
>>> input = ['abc', 'face', 'goo', 'cab', 'cafe']
>>> [list(group) for key,group in itertools.groupby(sorted(input, key=sorted), sorted)]
[['abc', 'cab'], ['cafe', 'face'], ['goo']]

(まあ、インポートを数えると本当に2行です...)

于 2011-11-18T11:34:58.150 に答える
2

ワンライナーではなく解決策...

d = {}
for item in input:
  s = "".join(sorted(item))
  if not d.has_key(s):
    d[s] = []
  d[s].append(item)
input2 = d.values()
于 2011-11-18T11:29:12.980 に答える
2

読み取り可能なバージョン:

from itertools import groupby
from operator import itemgetter

def norm(w):
  return "".join(sorted(w))

words = ['abc', 'cba', 'gaff', 'ffag', 'aaaa']

words_aug = sorted((norm(word), word) for word in words)

grouped = groupby(words_aug, itemgetter(0))

for _, group in grouped:
  print map(itemgetter(1), group)

ワンライナー:

print list(list(anagrams for _, anagrams in group) for _, group in groupby(sorted(("".join(sorted(word)), word) for word in words), itemgetter(0)))

版画:

[['aaaa'], ['abc', 'cba'], ['ffag', 'gaff']]
于 2011-11-18T11:31:23.167 に答える
1
from itertools import groupby

words = ['oog', 'abc', 'cab', 'cafe', 'face', 'goo', 'foo']

print [list(g) for k, g in groupby(sorted(words, key=sorted), sorted)]

結果:

[['abc', 'cab'], ['cafe', 'face'], ['foo'], ['oog', 'goo']]

groupby 関数だけを使用することはできません。これは、キー関数が同じ結果を生成する連続した要素のみをグループ化するためです。

簡単な解決策は、グループ化に使用するのと同じ関数を使用して、最初に単語を並べ替えることです。

于 2011-11-18T11:41:56.023 に答える