1

请帮助我理解以下代码片段:-

def any(l):
"whether any number is known from list l"
    s = set(list(l)[0])
    for x in l:
        s.intersection_update(set(x))
    return len(s) > 0

这里 l 是一个包含三元组列表的列表,例如 [(17,14,13),(19,17,2),(22,11,7),(22,13,1),(23,10 ,5),(23,11,2),(25,5,2)] 等。特别是我在理解第 3 行时遇到困难

s=set(list(l)[0])
4

3 回答 3

2
set(list(l)[0])

list(l)创建一个新列表l,然后[0]是获取它的第一个项目,即(17,14,13). 然后set((17,14,13))返回一组这个元组。set 是一个数据结构,它只包含唯一的可散列元素。即set((10,12,10))等于{10,12}

>>> l=[(17,14,13),(19,17,2),(22,11,7),(22,13,1),(23,10,5),(23,11,2),(25,5,2)]
>>> list(l)[0]
(17, 14, 13)
>>> set(list(l)[0])
{17, 13, 14}
于 2012-06-26T17:54:24.280 回答
2

s=set(list(l)[0])中,您正在从列表的第一个元素创建一个集合。在你的情况下,你可以使用set(l[0])它并且它会做同样的事情。本质上,您正在基于列表的第一个元组创建一个集合。总体而言,您的函数正在尝试查找所有元组之间是否有任何共同的元素(数字)。

于 2012-06-26T17:57:15.590 回答
0

Aset是一个 hashable-types 的 python 集合,具有集合中的任何实体都不能重复的特殊功能(从它的__hash__魔法方法返回的哈希,因此从该方法返回的布尔值__eq__也不能等于列表中的任何其他实体) 它用于需要集合且不能有重复实体的地方。

在不知道其使用上下文的情况下,很难完全说出片段的意图,特别是因为您拥有的 l 值都是容器列表中的元组。这intersection_update是一个集合的方法,它从原始返回一个集合,只保留在作为参数传递的那个中找到的元素。零索引键正在从列表中获取第一个元组。

http://docs.python.org/library/sets.html

于 2012-06-26T17:55:46.173 回答