for循环for for循环(python)不起作用

时间:2018-06-07 15:11:54

标签: python python-3.x list nested-loops

这个程序应该从列表中删除重复的元素,但它似乎不起作用,

 import random
 def func():
    a=random.sample(range(10),7)
    b=random.sample(range(10),6)
    list=a+b
    print(list)
    print(len(list))
    for x in list:
        for y in list:
            if x==y and list.index(x)!=list.index(y):
                list.remove(y)
print(func())

输出

[2, 6, 4, 7, 0, 9, 3, 8, 3, 5, 7, 0, 1]
13
None

4 个答案:

答案 0 :(得分:1)

我已经使用索引来从列表中检索元素,

import random
def func():
    a=random.sample(range(10),7)
    b=random.sample(range(10),6)
    list1=a+b
    print(list1)
    print(len(list1))
    for i in range(len(list1)-1):
        for j in range(i+1,len(list1)):
            if list1[i]==list1[j]:
                list1.remove(list1[j])
                break
    return list1            

print(func())

正如其他人使用set()来解决这个问题一样令人印象深刻,但我想你是一个像我这样的初学者,所以我就像你一样从基础知识中编写这个程序。

答案 1 :(得分:0)

您没有从func()返回任何内容,因此默认返回None

要返回内容,请使用return

 import random
 def func():
     a=random.sample(range(10),7)
     b=random.sample(range(10),6)
     list=a+b
     print(list)
     print(len(list))
     for x in list:
         for y in list:
             if x==y and list.index(x)!=list.index(y):
                 list.remove(y)
     return(list)
 print(func())

还有一种更简单的方法。

import random


def func():
    a=random.sample(range(10),7)
    b=random.sample(range(10),6)

    random_list = a + b
    print(random_list, len(random_list))

    seen = set()
    nondup_list = [x for x in random_list if not (x in seen or seen.add(x))]

    return(nondup_list)


print(func())

set根据定义只能包含唯一元素 - 因此,转换为集合可以删除重复项。但是,默认情况下它是无序的,因此我们不是仅仅转换到一个集合,而是逐个将成员添加到新列表中,检查它们是否已经不在我们的新列表中,如果它们不是,将它们添加到我们的seen集。将该方法归功于Martin Broadhurst

答案 2 :(得分:0)

我会把它作为答案。但请注意,您应该澄清您的头衔。

首先,如果您的主要目标是删除重复内容,那么您最好的选择是将list强制转换为set,因为set内部不允许重复。

a=random.sample(range(10),7)
b=random.sample(range(10),6)
my_list=a+b
print(set(list))

另请注意,您可以使用它来获得更好的输出:

a=random.sample(range(10),7)
b=random.sample(range(10),6)
my_list=a+b
print (','.join(str(v) for v in set(my_list)))

答案 3 :(得分:0)

除了所有其他好的答案,如何获得结果,你正在寻找逻辑是有缺陷的。

a_list.index(value)将始终返回列表中的value的第一个实例。

在您的实例中list.index(x) != list.index(y)永远不会成为现实,因为您始终会匹配xy所代表的值的第一个匹配项。

因此,只要x == ylist.index(x)始终等于list.index(y)