簡體   English   中英

使用列表理解更改列表中的多個元素

[英]Changing several elements in a list using list comprehension

一個例子:

example = [None, b'1', b'2', b'3', b'4', b'1', None, None, b'8', b'56', b'66', b'77', b'1', None]

我需要按以下方式更改此列表中的值: bytes應轉換為intNone應轉換為0並且每 6th 和 7th 元素應轉換為bool 預期輸出:

expected_output = [0, 1, 2, 3, 4, True, False, 0, 8, 56, 66, 77, True, False]

我的嘗試:

[int(value) if value else bool(value) if index in (5,6) else 0 for index, value in enumerate(example)]

結果:

[0, 1, 2, 3, 4, True, False, 0, 8, 56, 66, 77, 0, 0]

我知道這部分代碼有問題:

[int(value) if value else bool(value) if index in (5,6) else 0 for index, value in enumerate(example)]
                                       ^
                                       |
                                       |

如何將每第 6 個和第 7 個元素更改為bool

您需要檢查索引模 7(每組中的元素數)是 5 還是 6。但您還需要先執行此操作,因為b'1'也通過了if value測試:

[bool(value) if index % 7 in (5,6) else int(value) if value else 0 for index, value in enumerate(example)]

輸出:

[0, 1, 2, 3, 4, True, False, 0, 8, 56, 66, 77, True, False]

你添加到這個列表理解的邏輯越多,它就會變得越不可讀。 我建議你在這里使用正常的if / elif語句:

for ix, i in enumerate(example):
    if ix % 7 in (5,6):
        example[ix] = bool(i)
    elif not i:
        example[ix] = 0
    elif isinstance(i, bytes):
        example[ix] = int(i)

print(example)
# [0, 1, 2, 3, 4, True, False, 0, 8, 56, 66, 77, True, False]

基本的

您可以使用% (模)運算符實現旋轉

example = [
    None, b'1', b'2', b'3', b'4', b'1', None,
    None, b'8', b'56', b'66', b'77', b'1', None,
]

results = [
    bool(value) if index % 7 in {5, 6} else
    int(value) if value else 0
    for index, value in enumerate(example)
]
print(results)

輸出:

[0, 1, 2, 3, 4, True, False, 0, 8, 56, 66, 77, True, False]

蟒蛇式

但是,還有一些更 Pythonic 的方式:

import itertools

example = [
    None, b'1', b'2', b'3', b'4', b'1', None,
    None, b'8', b'56', b'66', b'77', b'1', None,
]
converters = itertools.cycle(itertools.chain(
    itertools.repeat(lambda x: int(x) if x else 0, 5),
    itertools.repeat(bool, 2),
))

results = [
    converter(value) for converter, value in zip(converters, example)
]
print(results)

輸出:同上。

解釋

  • itertools.cycle :制作循環迭代器。
  • itertools.chain :連接可迭代對象。
  • itertools.repeat :使迭代器重復指定的數量。
  • 所以converters = ...部分的意思是: lambda x: int(x) if x else 0 fucntion 五次, bool兩次,並重復這個循環!
  • 您可以為每個位置添加多個規則而無需復雜的if - else

暫無
暫無

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

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