Python - 根据列表

时间:2017-01-24 11:55:43

标签: python

我能做到这一点是非常啰嗦,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。

任何有关如何简单快速地执行此操作的提示都将非常感激。

干杯。

4 个答案:

答案 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