3

Python を使用して邪悪な絞首刑執行人ゲームを作成していますが、行き詰まっています。単語を家族に入れる方法を理解しようとしています。たとえば、リストがあるとします

ALLY BETA COOL DEAL ELSE FLEW GOOD HOPE IBEX 

すべての単語は、E がどこにあるかに基づいていくつかのファミリーのいずれかに分類されます。

- - - -, containing ALLY, COOL, GOOD
- E - -, containing BETA and DEAL
- - E -, containing FLEW and IBEX
E - - E, containing ELSE
- - - E, containing HOPE.

どの単語がどのファミリーに属しているかをマップするのに役立つ辞書を使用する方法はありますか? 私たちのクラスではまだ辞書について話す機会がありませんが、私は先を読み、可能だと信じています。私が使用しているファイルは約 170,000 語ですが、上記は単なる例です。

4

4 に答える 4

3
from itertools import groupby

words = ['ALLY', 'BETA', 'COOL', 'DEAL', 'ELSE', 'FLEW', 'GOOD', 'HOPE', 'IBEX']
e_locs = sorted(([c == 'E' for c in w], i) for i, w in enumerate(words))
result = [[words[i] for x, i in g] for k, g in groupby(e_locs, lambda x: x[0])]

結果:

>>> result
[['ALLY', 'COOL', 'GOOD'], ['HOPE'], ['FLEW', 'IBEX'], ['BETA', 'DEAL'], ['ELSE']]

Es の場所も追跡するバージョンを次に示します。

words = ['ALLY', 'BETA', 'COOL', 'DEAL', 'ELSE', 'FLEW', 'GOOD', 'HOPE', 'IBEX']
result = {}
for word in words:
    key = ' '.join('E' if c == 'E' else '-' for c in word)
    if key not in result:
        result[key] = []
    result[key].append(word)

結果:

>>> pprint.pprint(result)
{'- - - -': ['ALLY', 'COOL', 'GOOD'],
 '- - - E': ['HOPE'],
 '- - E -': ['FLEW', 'IBEX'],
 '- E - -': ['BETA', 'DEAL'],
 'E - - E': ['ELSE']}

最大のファミリを選択するには (最初のバージョンを使用します。resultはリストのリストです):

>>> max(result, key=len)
['ALLY', 'COOL', 'GOOD']

result.values()の代わりに使用できる 2 番目のバージョンを使用して最大のファミリを選択するにresultは、次のように使用できます:

>>> max(result.items(), key=lambda k_v: len(k_v[1]))
('- - - -', ['ALLY', 'COOL', 'GOOD'])
于 2013-04-10T21:52:00.047 に答える
1
In [1]: from itertools import groupby

In [2]: import string

In [3]: words = "ALLY BETA COOL DEAL ELSE FLEW GOOD HOPE IBEX".split()

In [4]: table = string.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
   ...:                          '????E?????????????????????')

In [5]: f = lambda w: w.translate(table)

In [6]: for k,g in groupby(sorted(words, key=f), f):
   ...:     print k, list(g)
   ...:     
???? ['ALLY', 'COOL', 'GOOD']
???E ['HOPE']
??E? ['FLEW', 'IBEX']
?E?? ['BETA', 'DEAL']
E??E ['ELSE']

# to get the biggest group
In [7]: max((list(g) for _,g in groupby(sorted(words, key=f), f)), key=len)
Out[7]: ['ALLY', 'COOL', 'GOOD']
于 2013-04-10T22:10:43.673 に答える