Разделить список python, если он содержит два последовательных нуля - PullRequest
3 голосов
/ 09 апреля 2020

У меня есть список 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]]

Я пробовал несколько списков, но я не могу найти правильное решение ...

Ответы [ 9 ]

2 голосов
/ 09 апреля 2020
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)
1 голос
/ 09 апреля 2020

Другие возможные решения:

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],
]
1 голос
/ 09 апреля 2020

Просто покажу, 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]]
1 голос
/ 09 апреля 2020
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]]
1 голос
/ 09 апреля 2020

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])]
1 голос
/ 09 апреля 2020
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]]
1 голос
/ 09 апреля 2020

Поскольку вам небезразлично отношение элемента к его соседу, я бы не рекомендовал использовать понимание списка.

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)

теперь, когда у нас есть «точки разделения», которые мы хотим получить для различных подпунктов. списки по этим индексам.


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])
1 голос
/ 09 апреля 2020

Это не лучшее решение, но ...

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)
0 голосов
/ 14 апреля 2020

Другие возможные решения: повернуть список на 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)

result:

[[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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...