1

こんにちは、Pythonを使用しています。2文字で構成される単語を生成できる関数を作成しようとしています。また、生成された単語のうち実際に辞書にある単語の数を数えたいと思います。

これは私がこれまでに持っているものです:

alphabet = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
            'p','q','r','s','t','u','v','w','x','y','z')
count1 = 0
text = " "

def find2LetterWords():
    for letter in alphabet:
        text += letter
        for letter in alphabet:
            text +=letter
    print text

これは私がこれまでに書いたコードであり、正しくないことを知っています。私はただ実験していた。そうそう、あなたが私を助けてくれたら素晴らしいと思います。どうも。

4

5 に答える 5

8

productモジュールからは、itertools考えられるすべての2文字の単語のリストを生成するために必要なものです。

from itertools import product

alphabet = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')

two_letter_words = product(alphabet, alphabet)

for word in two_letter_words:
    print word

それらのどれが辞書にあるかを比較するには、他の場所からそれを取得する必要があります

于 2012-06-11T00:22:10.260 に答える
5

別の方法では、リスト内包表記を使用します。

words = [x+y for x in alphabet for y in alphabet]

または、自分でアルファベットを入力せずに:

from string import ascii_lowercase as a
words = [x+y for x in a for y in a]

xvatar、Toote、および私による回答を比較してみましょう。

from itertools import product
from string import ascii_lowercase as a
import timeit

def nestedFor():
    w = []
    for l1 in a:
        for l2 in a:
            word = l1+l2
            w.append(word)
    return w

def nestedForIter():
    w = []
    for l1 in a:
        for l2 in a:
            yield l1+l2

def withProduct():
    return product(a,a)

def listComp():
    return [x+y for x in a for y in a]

def generatorComp():
    return (x+y for x in a for y in a)

# return list
t1 =  timeit.Timer(stmt="nestedFor()",
                   setup = "from __main__ import nestedFor")
t2 = timeit.Timer(stmt="list(withProduct())",
                   setup = "from __main__ import withProduct")
t3 = timeit.Timer(stmt="listComp()",
                   setup = "from __main__ import listComp")

# return iterator
t4 = timeit.Timer(stmt="nestedForIter()",
                   setup = "from __main__ import nestedForIter")
t5 = timeit.Timer(stmt="withProduct()",
                   setup = "from __main__ import withProduct")
t6 = timeit.Timer(stmt="generatorComp()",
                   setup = "from __main__ import generatorComp")

n = 100000

print 'Methods returning lists:'
print "Nested for loops:   %.3f" % t1.timeit(n)
print "list(product):      %.3f" % t2.timeit(n)
print "List comprehension: %.3f\n" % t3.timeit(n)

print 'Methods returning iterators:'
print "Nested for iterator:     %.3f" % t4.timeit(n)
print "itertools.product:       %.3f" % t5.timeit(n)
print "Generator comprehension: %.3f\n" % t6.timeit(n)

結果:

リストを返すメソッド:
ネストされたforループ:13.362
list(product):4.578
リスト内包表記:7.231

ジェネレーターを返すメソッド:
イテレーター用にネスト:0.045
itertools.product:0.212
ジェネレーターの理解度: 0.066

言い換えれば、itertools.product本当に完全なリストが必要な場合は、間違いなく使用してください。ただし、ジェネレータはより高速で、必要なメモリも少なくて済み、おそらく十分です。

ジェネレータ式のネストされたforループと同等であるとドキュメントに記載されていることを考えると、イテレータとしてのitertools.productの相対的な速度の低下は予想外です。多少のオーバーヘッドがあるようです。

于 2012-06-11T00:26:35.163 に答える
1
def find2LetterWords():
    words = []
    for first in alphabet:
        for second in alphabet:
            new_word = first + second
            words.append(new_word)
    print words
    return words
于 2012-06-11T00:24:13.307 に答える
1

質問の最初の部分はすでによく答えられていますが、ここに2番目の部分があります。

また、生成された単語のうち実際に辞書にある単語の数を数えたいと思います。

実際、これは非常に簡単です。単語のリストには、考えられるすべての組み合わせが含まれていることがわかります。そして、あなたは辞書の鍵がユニークであることを知っています。したがって、2文字の長さのキーは単語リストに含まれている必要があります。あなたがする必要があるのは、長さが2のキーの数を数えることだけです。

counts = sum(len(k) == 2 for k in my_dict.iterkeys())
于 2012-06-11T00:36:44.130 に答える
0

コメントに基づいて編集された回答:

def find2LetterWords():
     #this generates all possible 2-letter combos with a list comprehension
     words = [first + second for second in alphabet for first in alphabet]
     #create a new list with only those words that are in your_dictionary (a list)
     real_words = [word for word in words if word in your_dictionary]
     return real_words

機能のない素敵なワンライナーが必要な場合:

[word for word in [first + second for second in alphabet for first in alphabet] if word in your_dictionary]

明らかに、your_dictionary辞書の名前に置き換えてください。

于 2012-06-11T00:19:44.213 に答える