Разделение списка в части N приблизительно равной длины

Спасибо всем за ваш совет. В конце концов я нашел некоторую поддержку в этом вопросе.

Хитрость заключалась в том, чтобы смонтировать папку базы данных по умолчанию в качестве внешнего тома:

volumes:
  - databases:/var/lib/mysql

Это в основном работало на лету. Единственным предупреждением было то, что мой файл compose определил корневые учетные данные MySQL. Они были перезаписаны, когда монтировалось, поэтому мне пришлось вручную сбросить пароль root при первом запуске контейнера. На самом деле это должно быть исправлено, поскольку каталог данных теперь является внешним по отношению к тому, поэтому новый образ должен получить тот же пароль root. Должно быть в состоянии записать это изменение в установочные файлы.

134
задан wim 15 September 2017 в 01:02
поделиться

7 ответов

Вот тот, который мог работать:

def chunkIt(seq, num):
    avg = len(seq) / float(num)
    out = []
    last = 0.0

    while last < len(seq):
        out.append(seq[int(last):int(last + avg)])
        last += avg

    return out

тестирование:

>>> chunkIt(range(10), 3)
[[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]]
>>> chunkIt(range(11), 3)
[[0, 1, 2], [3, 4, 5, 6], [7, 8, 9, 10]]
>>> chunkIt(range(12), 3)
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
58
ответ дан 23 November 2019 в 23:48
поделиться

Если Вы не будете возражать против этого, то порядок будет изменен, я рекомендую Вам использовать @job решение, иначе, можно использовать это:

def chunkIt(seq, num):
    steps = int(len(seq) / float(num))
    out = []
    last = 0.0

    while last < len(seq):
        if len(seq) - (last + steps) < steps:
            until = len(seq)
            steps = len(seq) - last
        else:
            until = int(last + steps)
        out.append(seq[int(last): until])
        last += steps
return out
0
ответ дан 23 November 2019 в 23:48
поделиться

Если у вас уже есть на месте (который вы делаете), то это может быть проблемой разрешения файлов.

Кроме того, это, вероятно, вытягивает из Classic или или по умолчанию , если он не может прочитать ваш файл Comments.php в текущем каталоге вашей темы.

Убедитесь, что ваш Comments.php имеет те же разрешения, что и остальные файлы тематики.

-121--3409497-

Изменение кода к выходу N Куски, а не кусочки n :

def chunks(l, n):
    """ Yield n successive chunks from l.
    """
    newn = int(len(l) / n)
    for i in xrange(0, n-1):
        yield l[i*newn:i*newn+newn]
    yield l[n*newn-newn:]

l = range(56)
three_chunks = chunks (l, 3)
print three_chunks.next()
print three_chunks.next()
print three_chunks.next()

, что дает:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
[18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
[36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]

Это присвоивает дополнительные элементы к окончательной группе, которая не идеальна, но хорошо в вашей спецификации «примерно n равных частей» :-) К тому, что я имею в виду 56 элементов были бы лучше, как (19,19,18), тогда как это дает (18,18,20 ).

Вы можете получить более сбалансированный выход со следующим кодом:

#!/usr/bin/python
def chunks(l, n):
    """ Yield n successive chunks from l.
    """
    newn = int(1.0 * len(l) / n + 0.5)
    for i in xrange(0, n-1):
        yield l[i*newn:i*newn+newn]
    yield l[n*newn-newn:]

l = range(56)
three_chunks = chunks (l, 3)
print three_chunks.next()
print three_chunks.next()
print three_chunks.next()

, которые выходы:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
[19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37]
[38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]
17
ответ дан 23 November 2019 в 23:48
поделиться

Вот тот, который добавляет NONE , чтобы сделать списки одинаковых длин

>>> from itertools import izip_longest
>>> def chunks(l, n):
    """ Yield n successive chunks from l. Pads extra spaces with None
    """
    return list(zip(*izip_longest(*[iter(l)]*n)))

>>> l=range(54)

>>> chunks(l,3)
[(0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51), (1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52), (2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53)]

>>> chunks(l,4)
[(0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52), (1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53), (2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, None), (3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, None)]

>>> chunks(l,5)
[(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50), (1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51), (2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52), (3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53), (4, 9, 14, 19, 24, 29, 34, 39, 44, 49, None)]
4
ответ дан 23 November 2019 в 23:48
поделиться

Вы можете написать его справедливо просто как генератор списка:

def split(a, n):
    k, m = divmod(len(a), n)
    return (a[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in xrange(n))

Пример:

>>> list(split(range(11), 3))
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]
163
ответ дан 23 November 2019 в 23:48
поделиться

Пока вы не хотите ничего глупо, как непрерывные куски:

>>> def chunkify(lst,n):
...     return [lst[i::n] for i in xrange(n)]
... 
>>> chunkify(range(13), 3)
[[0, 3, 6, 9, 12], [1, 4, 7, 10], [2, 5, 8, 11]]
113
ответ дан 23 November 2019 в 23:48
поделиться

Посмотрите на numpy.split:

>>> a = numpy.array([1,2,3,4])
>>> numpy.split(a, 2)
[array([1, 2]), array([3, 4])]
3
ответ дан 23 November 2019 в 23:48
поделиться