1

我有这样的列表和字典:

list_1 = ['if looks kill then i'm murdering]

dic_1 = {"kill": -2, "murdering": -3}

我想提取与字典键匹配的列表项并将其附加到集合中。我有两个问题: 1. 我无法提取与字典中的键匹配的列表项 2. 如何将列表项附加到集合中?

set_1 = set()
for items in list_1:
   list_1 = items.lower().split()

   for term in dic_1:

      forth_list = [words for words in list_1 if term != words]
      print forth_list

这将打印

['if', 'looks', 'then', 'i', 'm', 'murdering']
['if', 'looks', 'kill', 'then', 'i', 'm']

set_1.add(forth_list) # this produce a TypeError: unhashable type: 'list'
print set_1      
4

2 回答 2

7

查找列表中的哪些元素在字典中的最有效方法是使用字典视图

set_1 |= dic_1.viewkeys() & list_1

诸如返回的字典视图dic_1.viewkeys()本质上是一个集合,通过使用&我们获取该集合和列表的交集。

使用就地 OR的|=语法更新集合以添加在右侧找到但尚未在集合中的任何元素。

或者,您可以使用该set.update()方法。该.add()方法一次采用一个元素,但您希望将列表中的所有元素添加集合中,而不是列表本身。

演示:

>>> list_1 = "if looks kill then i'm murdering".split()
>>> dic_1 = {"kill": -2, "murdering": -3, "monty": 5}
>>> set_1 = set()
>>> set_1 |= dic_1.viewkeys() & list_1
>>> set_1
set(['murdering', 'kill'])
>>> set_1 |= dic_1.viewkeys() & "monty python's flying circus".split()
>>> set_1
set(['murdering', 'kill', 'monty'])
于 2013-05-11T15:31:56.990 回答
3

您所描述的直接pythonic单行翻译是:

set_1 = set(val for val in list_1.split() if val in dic_1)

它从拆分中获取每个值,检查该值是否是字典中的键,并使用生成器表达式从这些值中构造一个集合。

于 2013-05-11T15:39:26.623 回答