我正在寻找一种优雅的方式来转换列表的某些元素并保留其余元素。
考虑以下列表:
list_ = [0, 0, 1, 1, 0, 0]
我想将
list_
转换为 [0, 1, 1, 1, 0, 1]
,当然我可以写一个带有一些 if 语句的 for 循环,例如:
list_ = [1 if i == 1 or i == 5 else list_[i] for i in range(len(list_))]
但是,我正在寻找一种基本方法,它复制值等于
_
的元素,并将其余值转换为给定值(在本例中为 1),例如:
list_ = [_, 1, _, _, _, 1] in list_
有没有一种蟒蛇式的方法可以做到这一点?还是我应该为它写一个函数?
另外,有时转换后的元素不等于0,但是例如'x'。
例如:
list_ = [0, 0, 1, 1, 0, 0]
# some magic functions etc... for converting 1st element to 'x' and 5th to 2
magic([_, 'x', _, _, _, 2], list_)
in>>> list_
out>> [0, 'x', 1, 1, 0, 2]
list_ = [0, 0, 1, 1, 0, 0]
mask = [None, 1, None, None, None, 1]
l = [el_mask if el_mask is not None else el_list for el_list, el_mask in zip(list_, mask)]
print(l) # [0, 1, 1, 1, 0, 1]
你的问题几乎可以归结为获取两个列表,并将它们与一个优先于另一个列表组合。
您可以使用 zip 函数组合 2 个列表,这将为您提供各个元素的元组 (
[(0, None), (0, 1), (1, None), (1, None), (0, None), (0, 1)]
)。然后你只需要在元组中的 2 之间选择正确的元素。
在 Python 中,你很少需要用
range(len(sequence))
做 - 如果你这样做,那实际上表明你是“unpythonic”
在这种情况下,您几乎找到了进行替换的理想方式 - 但对于这件事:
for
already 迭代您的初始列表元素:不需要具有 i
索引,然后获取元素在那个位置:
list_ = [1 if element != 1 else element for element in list_]