use*_*044 3 python list-comprehension slice python-2.7
我想更换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
Run Code Online (Sandbox Code Playgroud)
预期产出:
[[10, 0, 1, 0, 30, 40], [10, 0, 1, 0, 30, 40]]
Run Code Online (Sandbox Code Playgroud)
您很接近,可以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]]
Run Code Online (Sandbox Code Playgroud)
就个人而言,我不会在这种情况下使用列表理解,因为它很难看.下面的代码完全相同,更具可读性:
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]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |