修改范围之间的一组值
Modify group of values between a range
我有一个结构为 [(2, 4), (6, 7)]
的索引范围列表。
我还有一个包含 10 个元素的数组,所有元素的值为 False:
[False, False, False, False, False, False, False, False, False, False]
我想做的是修改这些范围之间的值并使它们为真。所以最终名单将是:
[False, True, True, True, False, True, True, False, False, False]
注意:列表的索引不是从零开始的。
我正在考虑基于两个 for 的解决方案,但它具有 N^2 复杂性:
for i in range(len(list_ranges)):
for j in range(len(my_list)):
if (j >= list_ranges[i][0] or j <= list_ranges[i][1]):
my_list[j] = True
如何提高算法的复杂度?
您只能更新相应的列表片段(就地修改列表,您已经在 my_list
中这样做了)。如果设置的项目数相等,则列表集切片是 O(K) operation。
>>> list_ranges = [(2, 4), (6, 7)]
>>> my_list = [False, False, False, False, False, False, False, False, False, False]
>>> list_ranges = [(2, 4), (6, 7)]
>>> for start, end in list_ranges:
... my_list[start-1:end] = [True] * (end - start + 1)
...
>>> my_list
[False, True, True, True, False, True, True, False, False, False]
请注意,这将在内存中启动中间列表,然后将它们分配给原始列表中的相应索引。
其次,如果范围列表比较小,那么我们可以检查索引是否位于给定的任何范围内。
>>> def solve(indices, my_list):
... return [any(start <= index <= end for start, end in indices) for index, item in enumerate(my_list, start=1)]
...
>>> my_list = [False, False, False, False, False, False, False, False, False, False]
>>> solve(ranges, my_list)
[False, True, True, True, False, True, True, False, False, False]
我有一个结构为 [(2, 4), (6, 7)]
的索引范围列表。
我还有一个包含 10 个元素的数组,所有元素的值为 False:
[False, False, False, False, False, False, False, False, False, False]
我想做的是修改这些范围之间的值并使它们为真。所以最终名单将是:
[False, True, True, True, False, True, True, False, False, False]
注意:列表的索引不是从零开始的。
我正在考虑基于两个 for 的解决方案,但它具有 N^2 复杂性:
for i in range(len(list_ranges)):
for j in range(len(my_list)):
if (j >= list_ranges[i][0] or j <= list_ranges[i][1]):
my_list[j] = True
如何提高算法的复杂度?
您只能更新相应的列表片段(就地修改列表,您已经在 my_list
中这样做了)。如果设置的项目数相等,则列表集切片是 O(K) operation。
>>> list_ranges = [(2, 4), (6, 7)]
>>> my_list = [False, False, False, False, False, False, False, False, False, False]
>>> list_ranges = [(2, 4), (6, 7)]
>>> for start, end in list_ranges:
... my_list[start-1:end] = [True] * (end - start + 1)
...
>>> my_list
[False, True, True, True, False, True, True, False, False, False]
请注意,这将在内存中启动中间列表,然后将它们分配给原始列表中的相应索引。
其次,如果范围列表比较小,那么我们可以检查索引是否位于给定的任何范围内。
>>> def solve(indices, my_list):
... return [any(start <= index <= end for start, end in indices) for index, item in enumerate(my_list, start=1)]
...
>>> my_list = [False, False, False, False, False, False, False, False, False, False]
>>> solve(ranges, my_list)
[False, True, True, True, False, True, True, False, False, False]