簡體   English   中英

為列表推導切片列表但保留切片值

[英]slicing a list for list comprehension but keeping sliced values

我想根據值是否為None,用布爾值替換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]]

您很接近,您可以在迭代內部列表時使用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]]

使用嵌套列表推導:

booleans= [[l[0]]+[1 if i is None else 0 for i in l[1:4]]+l[4:] for l in my_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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM