Ни один из этих ответов не является кусками одинакового размера, все они оставляют кусочек в конце, поэтому они не полностью сбалансированы. Если бы вы использовали эти функции для распределения работы, вы встроили перспективу того, что одна из них, вероятно, закончится задолго до других, поэтому она будет сидеть сложа руки, ничего не делая, в то время как другие продолжат усердно работать.
Например, текущий верхний ответ заканчивается:
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74]]
Я просто ненавижу этот ворчать в конце!
Другие, такие как list(grouper(3, xrange(7)))
и chunk(xrange(7), 3)
, оба возвращают : [(0, 1, 2), (3, 4, 5), (6, None, None)]
. None
просто набивают, и, на мой взгляд, довольно неэлегантно. Они НЕ равномерно разбивают фрагменты.
Почему мы не можем разделить их лучше?
Вот сбалансированное решение, адаптированное из функции, которую я использовал в производстве (Примечание в Python 3 для замените xrange
на range
):
def baskets_from(items, maxbaskets=25):
baskets = [[] for _ in xrange(maxbaskets)] # in Python 3 use range
for i, item in enumerate(items):
baskets[i % maxbaskets].append(item)
return filter(None, baskets)
И я создал генератор, который сделает то же самое, если вы поместите его в список:
def iter_baskets_from(items, maxbaskets=3):
'''generates evenly balanced baskets from indexable iterable'''
item_count = len(items)
baskets = min(item_count, maxbaskets)
for x_i in xrange(baskets):
yield [items[y_i] for y_i in xrange(x_i, item_count, baskets)]
И, наконец, так как я видим, что все вышеперечисленные функции возвращают элементы в непрерывном порядке (как они были заданы):
def iter_baskets_contiguous(items, maxbaskets=3, item_count=None):
'''
generates balanced baskets from iterable, contiguous contents
provide item_count if providing a iterator that doesn't support len()
'''
item_count = item_count or len(items)
baskets = min(item_count, maxbaskets)
items = iter(items)
floor = item_count // baskets
ceiling = floor + 1
stepdown = item_count % baskets
for x_i in xrange(baskets):
length = ceiling if x_i < stepdown else floor
yield [items.next() for _ in xrange(length)]
Чтобы проверить их:
print(baskets_from(xrange(6), 8))
print(list(iter_baskets_from(xrange(6), 8)))
print(list(iter_baskets_contiguous(xrange(6), 8)))
print(baskets_from(xrange(22), 8))
print(list(iter_baskets_from(xrange(22), 8)))
print(list(iter_baskets_contiguous(xrange(22), 8)))
print(baskets_from('ABCDEFG', 3))
print(list(iter_baskets_from('ABCDEFG', 3)))
print(list(iter_baskets_contiguous('ABCDEFG', 3)))
print(baskets_from(xrange(26), 5))
print(list(iter_baskets_from(xrange(26), 5)))
print(list(iter_baskets_contiguous(xrange(26), 5)))
Что распечатывает:
[[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19], [20, 21]]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'B', 'C'], ['D', 'E'], ['F', 'G']]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[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]]
Обратите внимание, что непрерывный генератор обеспечивает фрагменты в тех же шаблонах длины, что и два других, но все элементы расположены по порядку, и они разделены настолько равномерно, что можно разделить список дискретных элементов.
Обновление : для Xcode 4.5 и более поздних версий см. этот ответ .
Единственный известный мне способ сделать то, что вы просите - запускать Xcode от имени пользователя root.
>> sudo /Developer/Applications/Xcode.app/Contents/MacOS/Xcode
Если вы работаете с правами root, все процессы, запущенные из Xcode, также будут выполняться от имени root. Однако обратите внимание, что если вы создаете или редактируете какие-либо файлы, они будут принадлежать пользователю root, а это означает, что вам придется chown
их, прежде чем вы сможете редактировать их сначала как обычный пользователь.
Мне бы хотелось, чтобы Xcode говорил «Запустить процесс от имени пользователя root», но, насколько мне известно, такой возможности нет.
Обратите внимание, что вы также можете запустить приложение в отладчике командной строки gdb
для отладки вашего приложения. Выполните
>> sudo gdb /path/to/my/application
Затем вы можете оставить Xcode открытым, модифицировать по желанию и отлаживать свою программу в gdb. Я обычно этим и занимаюсь
РЕДАКТИРОВАТЬ : Читатели из будущего: см. Ответ Александра Ставонина; он говорит о том, как это сделать. Если у вас все в порядке с ключами ssh и включением пользователя root в вашей системе, его ответ - лучший вариант.
Отладка с правами root через SSH.
Редактировать активный исполняемый файл -> Отладка -> Отладка исполняемого файла удаленно через SSH.
Xcode может запускать приложение отладки как root. Для этого необходимо выполнить следующие шаги:
Включите пользователя root для локальной машины.
a. Запустите «Утилиту каталогов» (/ System / Library / CoreServices / Directory Utility.app)
b. Выберите «Включить корневого пользователя» в меню «Правка» и введите пароль root.
Разрешить удаленный вход.
a. В Системных настройках… -> Общий доступ, отметьте Удаленный вход. Эта опция включает демон ssh.
Создайте открытый / закрытый ключи ssh и скопируйте открытый ключ в папку .ssh / authorized_keys для пользователя root.
a. Откройте терминал на локальном компьютере и введите ssh-keygen -t rsa
b. Примите расположение по умолчанию и введите пароль для root.
c. Войдите как root su -
и создайте каталог ~ / .ssh. (~ == / var / root)
d. Скопируйте открытый ключ в корень: cat ~ / .ssh / id_rsa.pub | sshroot @ localhost "cat - >> ~ / .ssh / authorized_keys"
e. Проверяем, все ли в порядке. Введите ssh root @ localhost
. Он не должен запрашивать пароль root.
Включите удаленную отладку через ssh в Xcode.
а. Выберите «Получить информацию» в раскрывающемся меню «Исполняемые файлы»
b. В настройках «Отладка» отметьте «Отладка исполняемого файла удаленно через ssh» и поставьте root @ localhostв качестве информации «Подключиться к».
Теперь все должно быть в порядке ☺