2

次の形式の文字列、辞書があります。

('(Laughter flower)',
 {'laughter': (8.5, 0.9313),
  'flower': (7.88, 1.1718),
  'the': (4.98, 0.9145),
  'puppy': (7.58, 1.4581),
  'died': (1.56, 1.198),
  'laugh': (9.5, 0.1),
  'flow': (2.3, 0.51)
 }
)

各括弧は (スコア、標準偏差) に対応するタプルです。各タプルの最初の整数だけの平均をとっています。私はこれを試しました:

def score(string, d):
    if len(string) == 0:
        return 0
    string = string.lower()
    included = [d[word][0]for word in d if word in string]
    return sum(included) / len(included)

私が実行すると:

print score ('(Laughter flower)', {'laughter': (8.5, 0.9313), 'flower': 
(7.88, 1.1718), 'the':(4.98, 0.9145), 'puppy':(7.58, 1.4581), 
'died':(1.56, 1.198),'laugh': (9.5, 0.1),'flow': (2.3, 0.51)})

'laughter'and 'flower':のみの平均を取得する必要があります8.5 + 7.88 / 2が、この実行中の関数には'laugh'and 'flow':も含まれています8.5 + 7.88 + 9.5 + 2.3 /4

4

3 に答える 3

2

@Ignacoは、「フロー」と「笑い」を含めている理由について正しいです...

ただし、次のようにコードを記述できます。

data = ('(Laughter flower)', {'laughter': (8.5, 0.9313), 'flower': (7.88, 1.1718), 
'the':(4.98, 0.9145), 'puppy':(7.58, 1.4581), 'died':(1.56, 1.198), 'laugh': 
(9.5, 0.1),'flow': (2.3, 0.51)})

# Unpack for naming
keys, vals = data
# Assume () and first and last
look_for = keys[1:-1].lower().split()
# Get relevant numbers
nums = [vals[k][0] for k in look_for]
# Print average
print sum(nums) / len(nums)

したがって、関数を一般化して、関連するキーの最初の要素を平均するだけです。

def somefunc(keys, dct):
    vals = [dct[k][0] for k in keys]
    return sum(vals) / float(len(vals))

そして、有効なキーのシーケンスになるように、何らかの方法で文字列を前処理する必要があります。

some_string = '(laughter flower)'
keys = some_string[1:-1].lower().split()
print somefunc(keys, some_dict)
于 2012-10-22T07:12:45.130 に答える
1

このようなもの:

In [65]: lis=('(Laughter flower)', {'laughter': (8.5, 0.9313), 'flower': (7.88, 1.1718), 
'the':(4.98, 0.9145), 'puppy':(7.58, 1.4581), 'died':(1.56, 1.198), 'laugh': 
(9.5, 0.1),'flow': (2.3, 0.51)})

In [68]: strs=lis[0].strip('()').split() # returns ['Laughter', 'flower']

In [69]: lis1=[lis[1][x][0] for x in lis[1] if x in map(str.lower,strs)]

In [70]: sum(lis1)/float(len(lis1))
Out[70]: 8.1899999999999995
于 2012-10-22T07:03:41.710 に答える
0
def score(string,d):
    if string=="":
        return 0
    string=string.lower().split()
    included=[d[word][0] for word in d if word in string]
    return(sum(included)/len(included))

あなたの文字列 ='(笑いの花)'

その文字列は2つの異なる単語ではないため、[d [単語] [0]をdの単語に適用すると、単語が文字列の場合]、単語が取得されません。そのため、文字列の周りに () 括弧を使用しないと簡単です。代わりに「笑いの花」を使用してください。しかし、それでも2つの単語ではなく1つの文字列であるため、string.split()を分割する必要があり、2つの単語のリストが作成され、関数が機能します。

于 2012-10-27T04:45:48.510 に答える