【问题标题】:selecting out even number only once without repeating the same number in python list只选择一次偶数而不在python列表中重复相同的数字
【发布时间】:2022-08-21 11:47:22
【问题描述】:

list1 = [2,4,6,8,3,4,2,] 从上面的列表中,我需要获得以下结果 [2,4,6,8]

这是我尝试的方式。但它导致了一个错误而没有给出预期的结果。

list1 = [2,4,6,8,3,4,2,]
x=[]
for num in list1:
    if (num % 2 == 0) and (num not in list1):
        x.append(num)
        print(x)

所以我需要你的帮助才能只选择一次偶数而不重复相同的数字 提前致谢...!

  • (num not in list1) 总是False 因此and 连接总是返回False 并且列表永远不会被更新。该条件应替换为... (num not in x):。见 Sumit S Chawla 的回答

标签: python python-3.x list for-loop append


【解决方案1】:

我对您的代码进行了少量修改,只需应用 set() 以仅获取唯一值,list() 将其转换为列表,sorted() 以升序获取值

list1 = [2,4,6,8,3,4,2,1]
x=[]
for num in list1:
    if (num % 2 == 0):
        x.append(num)
print(sorted(list(set(x))))

输出

[2, 4, 6, 8]

编辑:如果您需要结果以与原始列表相同的顺序出现,则需要指定第二个条件(num not in x),不再需要使用set()

list1 = [4,2,8,3,6,5]
x=[]
for num in list1:
    if (num % 2 == 0) and (num not in x):
        x.append(num)

print(sorted(list(set(x))))
print(list(set(x)))
print(set(x))
print(x)    #this is the output you're looking for

输出

[2, 4, 6, 8]
[8, 2, 4, 6]
{8, 2, 4, 6}
[4, 2, 8, 6]

【讨论】:

  • 谢谢乌鸦。这给了我这个问题的预期答案。但是如果给定的列表没有按升序或降序等任何顺序,我们就不能使用排序方法,不是吗?那么还有其他方法可以获得结果吗?例如:list1= [4,2,8,3,6,5] 并获得结果 [4,2,8,6] 如果您有空闲时间请帮助我.. 再次感谢..
  • @Hesin Alwis set 不尊重插入顺序,因此如果使用 sort,任何基于 set 的答案也会有这样的副作用。也请查看其他答案!
  • 嗨@HesinAlwis,如果您不需要订购列表,可以省略方法sorted()。您是否需要按特定顺序排列结果?
【解决方案2】:

如果您想继续使用相同的逻辑,可以更新if 条件:

list1 = [2,4,6,8,3,4,2,]
x=[]
for num in list1:
    if (num % 2 == 0) and (num not in x):
        x.append(num)
        print(x)

其他解决方案可能是使用list comprehensionset

list1 = [2,4,6,8,3,4,2,]
l_set = set(list1)
nums = [val for val in l_set if val%2 == 0]
print(nums)

【讨论】:

    【解决方案3】:

    您可以将x 中的数字存储为set 数据类型,以防止重复,而不是列表

    list1 = [2,4,6,8,3,4,2]
    x=set()
    for num in list1:
        if (num % 2 == 0):
          x.add(num)
    
    print(list(x))
    

    或者,如果您想尊重输入的顺序,您可以拥有 1 个集合和 1 个列表。集合 (x_set) 用于有效检查一个数字是否已经在列表中,列表 (x_output) 用于存储输出

    list1 = [2,4,6,8,3,4,2]
    x_set=set()
    x_output = []
    for num in list1:
        if (num % 2 == 0) and (num not in x_set):
          x_set.add(num)
          x_output.append(num)
    
    print(x_output)
    

    【讨论】:

    • 现在 print 应该是 deindent
    • set 将不遵守广告订单
    • 我认为 OP 问题不需要正确的排序顺序
    • @tax 谢谢你的回复。我期待这个结果 [2,4,6,8] 。但是您的代码给出了以下结果 {2} {2, 4} {2, 4, 6} {8, 2, 4, 6} {8, 2, 4, 6} {8, 2, 4, 6}
    • 谢谢@taxevader,您的第二个回答给出了预期的结果
    【解决方案4】:

    使用列表理解,一行就足够了。首先遍历列表并测试偶数。然后在集合中转换以消除重复。返回列表后:

    list({x for x in list1 if x % 2 <= 0})
    

    输出:[8,2,4,6]

    在 cmets 和 clarifying 之后,再写一段代码就足够了:

    [list1[x] for x in [0] if list1[x] % 2 <= 0] + [list1[i] for i in range(len(list1)) if list1[i] % 2 <= 0 and list1[i] not in list1[0: i - 1]]
    

    输出:[2、4、6、8]

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 2016-10-22
      • 2020-11-28
      • 2013-04-23
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多