【问题标题】:slice list with if else condition using list comprehension使用列表推导将带有 if else 条件的列表切片
【发布时间】:2021-12-20 15:48:15
【问题描述】:

我希望列表中只有不是 1 [3,4,5] 的数字,并将 1 放入另一个列表中。下面是我写的代码

a_list=[1,1,1,1,3,4,5]
one_list=[]
a_list[:] = [a if a != 1 else one_list.append(a) for a in a_list]
print(a_list)
print(one_list)

这是 a_list 的输出 - [无、无、无、无、3、4、5]

我想要的 a_list 输出 - [3, 4, 5]

【问题讨论】:

  • 您在 else 中添加了append(即None)的结果。

标签: python list list-comprehension slice


【解决方案1】:

关于你问题的第一部分,正确的理解是:

[e for e in a_list if e != 1]

对于您想要做的事情,理解并不是真正正确的工具,请使用经典循环:

a_list=[1,1,1,1,3,4,5]

list1 = []
list2 = []
for e in a_list:
    if e == 1:
        list1.append(e)
    else:
        list2.append(e)     

输出:

>>> list1
[1, 1, 1, 1]

>>> list2
[3, 4, 5]

你想做什么以及为什么不应该做:

你试图用理解做的是:

a_list=[1,1,1,1,3,4,5]
one_list = []
a_list[:] = [e for e in a_list if (True if e != 1 else one_list.append(e))]
a_list, one_list

但是,您不应该这样做,因为它不会阻止制作临时列表,而且它不是显式/pythonic。

奖励:使用 itertools
from itertools import tee, filterfalse

def partition(pred, iterable):
    "Use a predicate to partition entries into false entries and true entries"
    # partition(is_odd, range(10)) --> 0 2 4 6 8   and  1 3 5 7 9
    t1, t2 = tee(iterable)
    return filterfalse(pred, t1), filter(pred, t2)

a_list=[1,1,1,1,3,4,5]
a_list, one_list = map(list, partition(lambda x: x == 1, a_list))

【讨论】:

  • 你总是可以在最后运行a_list[:] = list1,无论如何理解确实不会阻止制作临时列表
  • itertools documenation:list1, list2 = map(list, partition(lambda x: x == 1, a_list))中还有partition函数。没有创建临时列表,但由于在partition 的定义中使用了tee,对a_list 的元素进行了缓冲。
  • 如果你想看中常规循环,你可以定义a = {True: list1.append, False: list2.append},然后将循环体缩减为a[e==1](e)
  • itertools 总是很好,我会把它作为评论添加,第二个想法很好,但对于这样一个简单的情况可能不够明确;)
  • 有时我会预定义类似f = list1.append; g = list2.append 的内容,以避免在循环中查找属性。我现在停止自行车脱落 :) 循环是正确的解决方案。
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多