Как объединить и создать список с определенными критериями для вложенного списка в Python? - PullRequest
0 голосов
/ 12 марта 2019

У меня было два списка:

a = [0,0,2,2,2,2]
b = [1,3,2,3,6,7]

A и b соотнесены друг с другом, a[i] связаны с b[i], и я хочу получить

c = [[0,1,3],[2,2,3],[2,6,7]]

Когда a = 0, в b есть 2 значения, которые относятся к 0, то есть b[0],b[1], поэтому подключили их как первый внутренний список c,

Когда a= 2, есть 4 значения, которые относятся к 2, то есть b[2],b[3],b[4],b[5], но разрыв между b[3] и b[4] больше, чем 3, поэтому c[2] останавливается как [2,2,3] исоздайте новый список, который связал a == 2 и b[3],b[4],b[5]

Так что мой критерий состоит в том, когда b[i],b[i+1].... оба связаны с определенным значением a, но у них есть разрыв, равный >= 3, создайтесначала перечислите [a[i],b[i]], а затем объедините остальные.Я застрял на этом.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Вы написали

разрыв между b [3] и b [4] больше 3

, но не больше.Терка или равна.

a = [0, 0, 2, 2, 2, 2]
b = [1, 3, 2, 3, 6, 7]
c = []

for s in set(a):
    i = a.index(s)
    count = a.count(s)
    pom = []

    for j in range(i, i + count):
        if not pom:
            pom.append(b[j])
        elif abs(pom[-1] - b[j]) < 3:
                pom.append(b[j])
                if j + 1 == count:
                    pom.insert(0, s)
                    c.append(pom)
                    pom = []
                else:
                    pom.insert(0, s)
                    c.append(pom)
                    pom = [b[j]]

print(c)
0 голосов
/ 12 марта 2019

Начните с создания групп в соответствии с a:

c = zip(a, b)

c = {k: [bi for ai, bi in g] for k, g in groupby(c, lambda i: i[0])}

Теперь объединить список списков (по порядку):

c = [v for k, v in sorted(c.items())]

Теперь вам нужно разделить функцию на разрыв значения:

def split_max_gap(l, max_gap=2):
    acc = [l[0]]
    for x, y in zip(l, l[1:]):
        if abs(x - y) > max_gap:
            yield acc
            acc = [y]
            continue
        acc.append(y)
    if acc:
        yield acc

Применить разбиение к предыдущему списку списков:

c = map(split_max_gap, c)

Сглаживание:

c = list(chain.from_iterable(c))

c теперь должен содержать:

[[1, 3], [2, 3], [6, 7]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...