如果包含两个连续的零,则拆分 python 列表
Split a python list if it contains two consecutive zero's
我有一个 python 列表,用整数表示城市。城市 0 是总部。例如,可能的路由列表为:
[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
此列表包含三个路线。当它们具有连续的零时如何拆分这些列表?所以基本上我的预期输出是一个嵌套列表,其中所有元素都是单独的路由,如下所示:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
我尝试了很多列表推导式,但似乎找不到正确的解决方案...
routes = []
current_route = []
in_route = False
for city in entire_trip: # entire_trip is your initial list
if not in_route:
if city != 0:
in_route = True
current_route.append(0)
current_route.append(city)
else:
if city == 0:
current_route.append(0)
routes.append(current_route)
current_route = []
in_route = False
else:
current_route.append(city)
print(routes)
这不是最好的解决方案,但是...
numbers = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
n = []
pointer = 0
for i in range(len(numbers) -1):
if numbers[i] ==0 and numbers[i+1] == 0:
x = numbers[pointer:i+1]
pointer = i+1
n.append(x)
x = numbers[pointer:]
n.append(x)
print(n)
因为您关心元素与其相邻元素的关系,所以我不建议使用列表理解。
nums=[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
split_on = []
for i in range(len(nums)-1):
if nums[i] == 0 and nums[i+1] == 0:
split_on.append(i+1)
既然我们有了 "split points",我们想在这些索引处获取不同的子列表。
current_ind = 0
visits = []
for index in split_on:
visits.append(nums[current_ind:index])
current_ind = index
现在我们已经完成了旅行的最后一站:
visits.append(nums[current_ind:len(nums)+1])
x = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
item = []
final = []
for i in x :
if i != 0:
item.append(i)
else :
item.append(i)
if len(item) > 1 :
final.append(item)
item = []
print(final)
输出:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0], [0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
numpy
方法:
import numpy as np
x=[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
res=np.array(x)
res=np.split(res, np.arange(1, len(res))[np.logical_and(res[:-1]==0, res[1:]==0)])
输出:
>>> res
[array([ 0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126,
78, 0]), array([ 0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54,
0]), array([ 0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109,
39, 53, 0])]
def break_after_two_zero(array):
curr_list = []
for index, value in enumerate(array[:-1]):
curr_list.append(value)
if value == array[index + 1] == 0:
yield curr_list
curr_list = list()
if curr_list:
yield curr_list
data = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
print(list(break_after_two_zero(data)))
# >>> [[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
# [0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
# [0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
data = [0, 0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0, 0]
print(list(break_after_two_zero(data)))
# >>> [[0], [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0]]
data = [0, 7, 40, 41, 34, 96, 75, 0, 0, 0, 127, 48, 65, 79, 27, 126, 78, 0]
print(list(break_after_two_zero(data)))
# >>> [[0, 7, 40, 41, 34, 96, 75, 0],
# [0],
# [0, 127, 48, 65, 79, 27, 126, 78]]
只是去展示,做任何事情的 10 种方法...
这是一个超级简单方法,循环最少,if
和变量:
from itertools import zip_longest
# Setup testing list.
l = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
# Initialise.
d = {}
k = 0
# Split list based on requirements.
for i, j in zip_longest(l, l[1:]):
d.setdefault(k, []).append(i)
if all([i == 0, j == 0]):
k += 1
# Unpack results.
result = [v for v in d.values()]
输出:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
其他可能的解决方案:
res = [[]]
for i in range(len(data)):
res[-1].append(data[i])
if data[i] == 0 and i < len(data) - 1 and data[i + 1] == 0:
res.append([])
和
it = iter(data)
res = [[0, *iter(it.__next__, 0), 0] for _ in it]
print(res)
两者给出相同的输出:
[
[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0],
]
其他可能的解决方案:
将列表转为str,然后进行字符串处理。
aa = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
bb = map(str, aa)
str_city = "-".join(bb)
routes = str_city.replace('-0-0','+').split('+')
current_routes = [map(int, "0-{0}-0".format(route.strip('0').strip('-')).split('-')) for route in routes ]
print(current_routes)
结果:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
我有一个 python 列表,用整数表示城市。城市 0 是总部。例如,可能的路由列表为:
[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
此列表包含三个路线。当它们具有连续的零时如何拆分这些列表?所以基本上我的预期输出是一个嵌套列表,其中所有元素都是单独的路由,如下所示:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
我尝试了很多列表推导式,但似乎找不到正确的解决方案...
routes = []
current_route = []
in_route = False
for city in entire_trip: # entire_trip is your initial list
if not in_route:
if city != 0:
in_route = True
current_route.append(0)
current_route.append(city)
else:
if city == 0:
current_route.append(0)
routes.append(current_route)
current_route = []
in_route = False
else:
current_route.append(city)
print(routes)
这不是最好的解决方案,但是...
numbers = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
n = []
pointer = 0
for i in range(len(numbers) -1):
if numbers[i] ==0 and numbers[i+1] == 0:
x = numbers[pointer:i+1]
pointer = i+1
n.append(x)
x = numbers[pointer:]
n.append(x)
print(n)
因为您关心元素与其相邻元素的关系,所以我不建议使用列表理解。
nums=[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
split_on = []
for i in range(len(nums)-1):
if nums[i] == 0 and nums[i+1] == 0:
split_on.append(i+1)
既然我们有了 "split points",我们想在这些索引处获取不同的子列表。
current_ind = 0
visits = []
for index in split_on:
visits.append(nums[current_ind:index])
current_ind = index
现在我们已经完成了旅行的最后一站:
visits.append(nums[current_ind:len(nums)+1])
x = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
item = []
final = []
for i in x :
if i != 0:
item.append(i)
else :
item.append(i)
if len(item) > 1 :
final.append(item)
item = []
print(final)
输出:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0], [0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
numpy
方法:
import numpy as np
x=[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
res=np.array(x)
res=np.split(res, np.arange(1, len(res))[np.logical_and(res[:-1]==0, res[1:]==0)])
输出:
>>> res
[array([ 0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126,
78, 0]), array([ 0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54,
0]), array([ 0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109,
39, 53, 0])]
def break_after_two_zero(array):
curr_list = []
for index, value in enumerate(array[:-1]):
curr_list.append(value)
if value == array[index + 1] == 0:
yield curr_list
curr_list = list()
if curr_list:
yield curr_list
data = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
print(list(break_after_two_zero(data)))
# >>> [[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
# [0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
# [0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
data = [0, 0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0, 0]
print(list(break_after_two_zero(data)))
# >>> [[0], [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0]]
data = [0, 7, 40, 41, 34, 96, 75, 0, 0, 0, 127, 48, 65, 79, 27, 126, 78, 0]
print(list(break_after_two_zero(data)))
# >>> [[0, 7, 40, 41, 34, 96, 75, 0],
# [0],
# [0, 127, 48, 65, 79, 27, 126, 78]]
只是去展示,做任何事情的 10 种方法...
这是一个超级简单方法,循环最少,if
和变量:
from itertools import zip_longest
# Setup testing list.
l = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
# Initialise.
d = {}
k = 0
# Split list based on requirements.
for i, j in zip_longest(l, l[1:]):
d.setdefault(k, []).append(i)
if all([i == 0, j == 0]):
k += 1
# Unpack results.
result = [v for v in d.values()]
输出:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]
其他可能的解决方案:
res = [[]]
for i in range(len(data)):
res[-1].append(data[i])
if data[i] == 0 and i < len(data) - 1 and data[i + 1] == 0:
res.append([])
和
it = iter(data)
res = [[0, *iter(it.__next__, 0), 0] for _ in it]
print(res)
两者给出相同的输出:
[
[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0],
]
其他可能的解决方案: 将列表转为str,然后进行字符串处理。
aa = [0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0,
0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0,
0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]
bb = map(str, aa)
str_city = "-".join(bb)
routes = str_city.replace('-0-0','+').split('+')
current_routes = [map(int, "0-{0}-0".format(route.strip('0').strip('-')).split('-')) for route in routes ]
print(current_routes)
结果:
[[0, 7, 40, 41, 34, 96, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 124, 59, 82, 133, 102, 57, 54, 0],
[0, 64, 97, 81, 87, 80, 61, 98, 52, 101, 83, 60, 109, 39, 53, 0]]