我能做到这一点是非常啰嗦,hacky代码。我正在寻找关于如何以干净,pythonic方式做到这一点的指针。我正在使用 Python 3.5.2
我有2个有序的单词列表....
ting_word_bag = ['word', 'tree', 'dependency', 'number', 'pattern']
ted_word_bag = ['dependency', 'verb', 'grammar', 'word', 'parser']
我想迭代ted_word_bag中的单词,并根据单词在ting_word_bag
中的位置为每个单词指定一个值。这很简单。
更不用说我想要反转这些值,以便ting_word_bag列表中的第一个单词值得5分,列表中的最后一个单词值得1分(基于5个元素的列表)
对于此示例,ted_word_bag的总分为8分。 'word'
为5,'dependency'
为3。
任何有关如何简单快速地执行此操作的提示都将非常感激。
干杯。
答案 0 :(得分:1)
使用理解,你可以建立一个dict来存储"得分"对于每个单词:
>>> some_dict = {j:i for i,j in enumerate(ting_word_bag)}
>>> some_dict
{'information': 5, 'word': 0, 'pattern': 4, 'tree': 1, 'number': 3, 'dependency': 2}
使用reversed
或其他方法,您可以获得所需内容。
接下来,使用字典的.get(index, default-value)
,您将第二个列表的每个值相加:
>>> sum(some_dict.get(i,0) for i in ted_word_bag)
8 #with a correct value of some_dict
答案 1 :(得分:0)
ting_word_bag = ['word', 'tree', 'dependency', 'number', 'pattern']
ted_word_bag = ['dependency', 'verb', 'grammar', 'word', 'parser']
鉴于以下内容:
from itertools import count
scores = dict(zip(reversed(ting_word_bag), count(1)))
total = sum(scores.get(i,0) for i in ted_word_bag)
正确分配分数:
>>> scores
{'pattern': 1, 'tree': 4, 'number': 2, 'word': 5, 'dependency': 3}
即便如此,结果总数也是一样的:
>>> total
8
答案 2 :(得分:0)
使列表理解以相反的顺序枚举ting_word_bag
:
points = [(i,w) for i,w in enumerate(ting_word_bag[::-1])]
对得分的另一种理解:
score = sum([x[0] for x in points if x[1] in ted_word_bag])
答案 3 :(得分:0)
此代码执行此操作(假设未找到项目的分数为0
):
ting_word_bag = ['word', 'tree', 'dependency', 'number', 'pattern']
ted_word_bag = ['dependency', 'verb', 'grammar', 'word', 'parser']
score = {x: i + 1 for i, x in enumerate(reversed(ting_word_bag))}
values = [(score.get(x, 0), x) for x in ted_word_bag]
print(values)
print(sum(i[0] for i in values))
输出:
[(3, 'dependency'), (0, 'verb'), (0, 'grammar'), (5, 'word'), (0, 'parser')]
8