Python返回独特的元素组合

时间:2015-07-11 20:06:36

标签: python

如果我有这样的清单:

ls = [['water', 'chips', 'pie'], ['soda', 'nuts', 'cake'], ['water', 'chips', 'cake']]

让我们说这个清单分为"饮料","零食"和"沙漠"。我想返回所有独特的元素组合,以及#34;饮料"和"零食"。该列表应返回:

ls = [['water', 'chips'], ['soda', 'nuts']]

它不会返回第三个列表,因为waterchips已存在于ls的另一个列表中。

3 个答案:

答案 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,它在内部列表中给出食物项类型的位置。 然后,我在这里创建一个必需项目元组,即drinksnack,并应用set运算符来过滤重复项。

这样做的好处是您只需传入项目类型名称而无需担心其索引。您还可以在准备元组时更改要使用的内部列表的项目数。

答案 1 :(得分:1)

您希望每个列表都有唯一的值。您已经在中途,因为unqBuilding中有一组所有唯一值。

unique_per_row = [list(set(r).difference(unqBuilding))
                  for r in row]

以上内容将生成一个列表,其中包含每行中仅显示在该行中的项目列表。

集合的difference方法采用另一个集合并返回一个新集合,其中的项目仅出现在第一个集合中。使用维恩图更容易理解。在下图中,right.difference(left)的等效项以红色突出显示。

Complement

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