[英]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
應轉換為int
, None
應轉換為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.