【问题标题】:Remove not int elements in list [duplicate]删除列表中的非 int 元素 [重复]
【发布时间】:2018-04-30 23:54:48
【问题描述】:

嗨,我在 python 中有这个任务,我应该删除所有非 int 元素,下面代码的结果是[2, 3, 1, [1, 2, 3]],我不知道为什么结果列表没有被移走。请仅提供经过测试的建议,我的意思是可行的建议。

# Great! Now use .remove() and/or del to remove the string, 
# the boolean, and the list from inside of messy_list. 
# When you're done, messy_list should have only integers in it
messy_list = ["a", 2, 3, 1, False, [1, 2, 3]]
for ele in messy_list:  
   print('the type of {} is  {} '.format(ele,type(ele)))
   if type(ele) is not int:
     messy_list.remove(ele)
     print(messy_list) 

【问题讨论】:

  • 要删除列表吗?或扁平化
  • 不要修改你正在迭代的列表。
  • 您在迭代列表时正在修改列表。这种行为是未定义的。特别是在这种情况下,它似乎删除了False,因此将列表移动到False 的旧位置,然后发现下一个索引超出了列表的范围。您应该创建一个新列表,或者实际上使用列表推导式。
  • @MeesdeVries 行为已定义且一致,只是不直观,因此不推荐
  • @Chris_rands,我的错,谢谢你的纠正。

标签: python


【解决方案1】:

试试这个:

>>> messy_list = ["a", 2, 3, 1, False, [1, 2, 3]]
>>> [elem for elem in messy_list if type(elem) == int]
[2, 3, 1]

【讨论】:

  • type(1) 只是int
  • @Chris_Rands 不是 OP 想要的吗?标题说 - 从列表中删除非 int 元素
  • 我认为if type(elem) is int 在这种情况下可能会更好
  • 是的,但是当您知道类型是int 时,为什么每次都调用type(1)?只需使用type(elem) == int
【解决方案2】:

此问题与您的 messy_list 中是否存在列表无关,而是与您在迭代列表时修改列表有关。

例如,使用messy_list = ["a", 2, 3, 1, False, "a"],您将得到[2, 3, 1, "a"]

另一方面: [elem for elem in messy_list if type(elem) == int] 返回[2, 3, 1],这就是你想要的。

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 2020-08-02
    • 2018-05-02
    • 2014-07-06
    • 1970-01-01
    • 2020-11-02
    • 2015-01-05
    • 2012-05-09
    • 2018-01-01
    相关资源
    最近更新 更多