Python 使用列表理解
我有一个字符串,字典的形式是:Python 使用列表理解,python,string,list,dictionary,tuples,Python,String,List,Dictionary,Tuples,我有一个字符串,字典的形式是: ('(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 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)})
我应该只得到'laugh'
和'flower'
的平均值:8.5+7.88/2
,但是这个运行函数还包括'laugh'
和'flow'
:8.5+7.88+9.5+2.3/4
类似这样:
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
@伊格纳科说得对,你为什么要把“流”和“笑”包括在内 不过,您可以按照以下方式编写代码:
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)
你的字符串='(笑声之花)'
这是一个字符串,不是两个不同的单词,所以当你申请时
[d[word][0]对于d中的单词,如果是字符串中的单词]则无法获取该单词。
因此,如果在字符串周围不使用()括号,就很容易了。
取而代之的是“笑花”。
但是它仍然是一个字符串而不是两个单词,所以你必须拆分它string.split()
创建一个包含两个单词的列表,那么您的函数就可以工作。如果我的字符串、字典可以是任何东西呢?我不想把
“数据”
标识为特定的东西@JonClements@BillyMann我不明白你。。。如果它不是一个字符串,也不是一个字典,那么无论如何你必须有一个不同的方法…它是一个字符串和一个字典,但我函数的要点是调用任何给定字典中的字符串@JonClements@BillyMann我已经尝试了一下我认为你的意思,但这是函数可以得到的一般性功能。你必须以另一种方式循环:如果单词在字符串中,则单词在dict中不是,而是对于单词在字符串中。如果单词在dict中
,则split()。这样做会给我一个ZeroDivisionError@thg435抱歉,这里没有在线调试服务。
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))