为列表理解切片列表但保留切片值
slicing a list for list comprehension but keeping sliced values
我想根据值是否为 None 将 items[1]
、items[2]
、items[3]
替换为布尔值。这有效,但从输出中消除了 items[0]
、items[4]
、items[5]
。我可以 insert/append 返回值,但我认为必须有一种方法可以在一行中完成。
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]]
使用嵌套列表理解:
booleans= [[l[0]]+[1 if i is None else 0 for i in l[1:4]]+l[4:] for l in my_list]
您很接近,您可以在遍历内部列表时使用 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]]
您需要将列表的其余部分(您不想替换其元素)添加到您编辑的 sub_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]]
我想根据值是否为 None 将 items[1]
、items[2]
、items[3]
替换为布尔值。这有效,但从输出中消除了 items[0]
、items[4]
、items[5]
。我可以 insert/append 返回值,但我认为必须有一种方法可以在一行中完成。
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]]
使用嵌套列表理解:
booleans= [[l[0]]+[1 if i is None else 0 for i in l[1:4]]+l[4:] for l in my_list]
您很接近,您可以在遍历内部列表时使用 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]]
您需要将列表的其余部分(您不想替换其元素)添加到您编辑的 sub_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]]