【问题标题】:slicing a list for list comprehension but keeping sliced values切片列表以进行列表理解但保留切片值
【发布时间】:2015-03-18 18:59:59
【问题描述】:

我想根据值是否为无,将 items[1]items[2]items[3] 替换为布尔值。这有效,但从输出中消除了items[0]items[4]items[5]。我可以重新插入/追加值,但我认为必须有一种方法可以在一行中完成。

my_list = [[10,30,None,20,30,40],[10,20,None,10,30,40]]
booleans = [[1 if item is None else 0 for item in each_list[1:-2]] for each_list in my_list]
print booleans

预期输出:

[[10, 0, 1, 0, 30, 40], [10, 0, 1, 0, 30, 40]]

【问题讨论】:

  • 为了清楚起见,只需添加预期的输出
  • @BhargavRao 刚刚添加
  • 注意可以赋值给切片; each_list[1:-2] = [1 if item is None ...],尽管您必须展开列表理解才能执行此操作。

标签: python python-2.7 list-comprehension slice


【解决方案1】:

你很接近,你可以在迭代你的内部列表时使用enumerate 并测试索引是否在应该修改的集合中。这使您可以通过简单地修改 tests 集轻松地修改应测试的索引,并且不需要某种难以修改的切片形式。

my_list = [[10,30,None,20,30,40],[10,20,None,10,30,40]]
tests = {1, 2, 3}

new_list = [[v if i not in tests else 1 if v is None else 0 for i, v in enumerate(x)] 
            for x in my_list]

print(new_list)
# [[10, 0, 1, 0, 30, 40], [10, 0, 1, 0, 30, 40]]

不过,就我个人而言,在这种情况下我不会使用列表推导,因为它。下面的代码完全一样,而且可读性更强:

my_list = [[10,30,None,20,30,40],[10,20,None,10,30,40]]
tests = {1, 2, 3}

for x in my_list:
    for i, v in enumerate(x):
        if i in tests:
            x[i] = 1 if v is None else 0

print(my_list)
# [[10, 0, 1, 0, 30, 40], [10, 0, 1, 0, 30, 40]]

【讨论】:

  • @Fsifegydd,如果要修改的元素是通过slice 对象定义的呢?
【解决方案2】:

使用嵌套列表推导:

booleans= [[l[0]]+[1 if i is None else 0 for i in l[1:4]]+l[4:] for l in my_list]

【讨论】:

    【解决方案3】:

    您需要将列表的其余部分(您不想替换其元素)添加到您编辑的 sub_list 中:

    >>> booleans = [each_list[0:1]+[1 if item is None else 0 for item in each_list[1:-2]]+each_list[4:] for each_list in my_list]
    >>> print booleans
    [[10, 0, 1, 0, 30, 40], [10, 0, 1, 0, 30, 40]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多