Python:删除仅包含一个项目实例的子列表

时间:2014-01-02 16:14:03

标签: python list

大家好!基本上,我需要从列表中删除每个子列表,其中只包含任何项目中的一个 - 只要该项目本身不是一个。

这是一个例子:如果我有这个,

list = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]

我反过来想要这个:

list = [(0, 0), (1, 1)]

我最初的尝试是:

for sublist in list:
    for item in sublist:
        if sublist.count(item) == 1 and item != 1:
            list.remove(sublist)

不幸的是,这干扰了原来for循环的循环(我认为),所以我最终会得到类似的结果:ValueError: list.remove(x): x not in list任何帮助都会有所帮助。

编辑:我想道歉,(1,3)不应该在输出中!很抱歉这个混乱,希望这个程序比我做的更好!

5 个答案:

答案 0 :(得分:3)

  1. 在运行for循环之前复制列表,因此在循环期间不会修改iterable

  2. 删除一个sublist并中断,不要尝试将其删除两次。

  3. 虽然我在输出中只获得[(0, 0), (1, 1)]但不是(1,3)

    for sublist in list[:]:
        for item in sublist:
            if sublist.count(item) == 1 and item != 1:
                 list.remove(sublist)
                 break
    

答案 1 :(得分:0)

我不确定我是否理解任务,但在迭代它时更改列表绝不是一个好主意。 尝试先复制它,然后遍历副本。

类似的东西:

list_copy = list[:]
for sublist in list_copy:
    for item in sublist:
        if sublist.count(item) == 1 and item != 1:
            list.remove(sublist)

请注意list_copy = list将复制引用,这意味着更改一个列表也会更改另一个列表,因此您要编写list_copy = list[:]

P.S。 使用list类型名称作为变量是一个非常糟糕的主意。尝试使用其他名称。

答案 2 :(得分:0)

我认为此代码适合您:

list = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]

out_list = [t for t in list if (t[0] == t[1]) or t.count(1) > 0]

此代码生成一个新列表,然后您可以将其重新分配给输入列表。 但上面的代码会在您的输入上生成:

[(0, 0), (0, 1), (1, 1), (1, 0), (1, 3)]

很抱歉,如果我理解你的任务不正确。

答案 3 :(得分:0)

我必须说明你对代码的作用的解释并不清楚。

您可能想要转到while循环:

List = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]
i = 0;
o = 0;
while i<len(List):
    while o<len(List[i]):
        if List[i].count(o) == 1 and List[i][o] != 1:
            List.remove(List[i])
        o+=1
    i+=1
    o=0;
print(List)

我得到了:

  

[(0,0),(0,2),(1,1),(1,3),(0,3)]

答案 4 :(得分:0)

您可以使用filter功能过滤列表。首先,编写一个函数,它接受列表中的元素,如果元素应该在列表中,则返回True,如果不是,则返回False。像这样:

 def predicate(x):
    for item in x:
        if x.count(item) == 1 and item != 1:
            return False
    return True

现在,您可以列出您的列表(请勿将其称为list,因为list是我们必须在一秒钟内使用的功能,并且通过调用您无法使用的内容列表说功能)

l = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]

使用谓词过滤它:

itr_res = filter(predicate,l)

但请注意,这会返回iterable,而不是列表。您可能需要一个列表,因此请使用list函数从iterable构建一个列表。

res = list(itr_res)

这给出了结果列表:

[(0,0),(1,1)]

正如其他人所指出的那样,很难弄清楚你希望功能过滤的内容。你的代码做了一件事,你的例子和其他,你的描述是模糊的。你可以尝试使用谓词函数,直到你实现你想要的那样