如果我有这样的清单:
ls = [['water', 'chips', 'pie'], ['soda', 'nuts', 'cake'], ['water', 'chips', 'cake']]
让我们说这个清单分为"饮料","零食"和"沙漠"。我想返回所有独特的元素组合,以及#34;饮料"和"零食"。该列表应返回:
ls = [['water', 'chips'], ['soda', 'nuts']]
它不会返回第三个列表,因为water
和chips
已存在于ls
的另一个列表中。
答案 0 :(得分:2)
您可以执行以下操作:
>>> ls = [['water', 'chips', 'pie'], ['soda', 'nuts', 'cake'], ['water', 'chips', 'cake']]
>>> item_position = { "drink": 0,
"snack": 1,
"desert": 2}
>>> set((x[item_position['drink']], x[item_position['snack']]) for x in ls)
{('soda', 'nuts'), ('water', 'chips')}
在这里,我正在创建一个item_position
dict,它在内部列表中给出食物项类型的位置。
然后,我在这里创建一个必需项目元组,即drink
和snack
,并应用set
运算符来过滤重复项。
这样做的好处是您只需传入项目类型名称而无需担心其索引。您还可以在准备元组时更改要使用的内部列表的项目数。
答案 1 :(得分:1)
您希望每个列表都有唯一的值。您已经在中途,因为unqBuilding
中有一组所有唯一值。
unique_per_row = [list(set(r).difference(unqBuilding))
for r in row]
以上内容将生成一个列表,其中包含每行中仅显示在该行中的项目列表。
集合的difference
方法采用另一个集合并返回一个新集合,其中的项目仅出现在第一个集合中。使用维恩图更容易理解。在下图中,right.difference(left)
的等效项以红色突出显示。
答案 2 :(得分:0)
pos0和pos1必须是函数的变量,以及列表本身,但你明白了。
pos0 = 0
pos1 = 2
ls = [['water', 'chips', 'pie'], ['soda', 'nuts', 'cake'], ['water', 'chips', 'cake']]
s = set()
for row in ls:
#cant hash a list, tuple it
tu = (row[pos0], row[pos1])
s.add(tu)
#untuple the set's contents back to lists
print [list(tu) for tu in s]
输出:pos 0,1
[['soda', 'nuts'], ['water', 'chips']]
pos 0,2
[['soda', 'cake'], ['water', 'cake'], ['water', 'pie']]