"对于"循环和"如果"在python中创建列表的条件

时间:2017-12-19 10:55:39

标签: python loops

source=[1,2,3,4,2,3,5,6]

dst=[]
for item in source:
    if item not in dst:
        dst.append(item)

print(dst) # [1,2,3,4,5,6]

我可以将代码简化为以下内容:

dst=[item for item in [1,2,3,4,2,3,5,6] if item not in 'this array']

由于

5 个答案:

答案 0 :(得分:6)

不,列表推导不能自我指涉。

您似乎想要从列表中删除重复项。有关解决此问题的大量方法,请参阅thisthis个问题。

答案 1 :(得分:4)

你可能正在寻找一个集合,因为你在创建它时不能引用这个数组

>>> source = [1,2,3,4,2,3,5,6]
>>> set(source)
{1, 2, 3, 4, 5, 6}

如果您确实希望保留原始订单,则可以使用集合(dst)跟踪已添加到seen的内容:

>>> source = [1,2,3,4,2,3,5,6]
>>> seen = set()
>>> dst = []
>>> for i in source:
>>>     if i not in seen:
>>>         dst.append(i)
>>>         seen.add(i)
>>>
>>> dst
[1, 2, 3, 4, 5, 6]

答案 2 :(得分:3)

您无法在列表推导中引用dst,但您可以通过在每次迭代中对其进行切片来检查source中先前迭代的项目的当前项:

source = [1, 2, 3, 4, 2, 3, 5, 6]
dst = [item for i, item in enumerate(source)
       if item not in source[0:i]]

print(dst)  # [1, 2, 3, 4, 5, 6]

答案 3 :(得分:0)

如果使用if和for是您的要求 怎么样?

[dst.append(item) for item in source if item not in dst]

答案 4 :(得分:0)

您可以使用列表推导修改现有列表,而不是创建新列表,如下所示:

In [1]: source
Out[1]: [1, 9, 2, 5, 6, 6, 4, 1, 4, 11]

In [2]: [ source.pop(i) for i in range(len(source))[::-1] if source.count(source[i]) > 1 ]
Out[2]: [4, 1, 6]

In [3]: source
Out[3]: [1, 9, 2, 5, 6, 4, 11]

作为另一种方法,您可以先使用set获取唯一列表,然后根据源索引值对其进行排序,如下所示:

source = [1, 9, 2, 5, 6, 6, 4, 1, 4, 11]
d = list(set(source))
d.sort(key=source.index)
print(d)  # [1, 9, 2, 5, 6, 4, 11]