Разделение данных из списка - PullRequest
0 голосов
/ 10 сентября 2018

Итак, у меня есть набор данных, и я пытаюсь разбить данные на 4 списка. Я написал эту функцию, чтобы сделать именно это.

def __spit_list_into_group(self, IDList, n, list1, list2, list3, list4):
    newlist = [IDList[i:i + n] for i in xrange(0, len(IDList), n)]
    list1, list2, list3, list4 = map(list, zip(*newlist))

    return list1, list2, list3, list4

Однако, когда я устанавливаю n равным 4, код может разбить данные только на 3 списка, а когда я устанавливаю n равным 5, код разбивает его на 5 списков. Почему код не делит данные на 4 и как я могу получить их для разделения данных на 4?

РЕДАКТИРОВАТЬ: я понял, что этот набор данных имеет 15 точек данных, поэтому я могу разделить его только на 3 и 5. Как я могу разделить данные на 4, не обязательно, равные группы? Мне нужно написать что-то гибкое, так как я хочу, чтобы тот же код работал с другими наборами данных, которые могут иметь больше или меньше точек данных.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Эту проблему можно упростить с помощью нарезки индекса.

Если вы хотите создать n списки примерно одинакового размера, вы можете сделать это:

def split_list(input_list, n):
    output_lists = [input_list[i::n] for i in range(n)]
    return output_lists

Это пошагово просматривает ваш входной список с шагом n, чтобы получить необходимое количество выходных списков.

Например, скажем, ваш список ввода range(15), или [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14], и вы хотите n=4 списки. Это вернет [[0,4,8,12],[1,5,9,13],[2,6,10,14],[3,7,11]].

В качестве альтернативы, если вы хотите сгруппировать список ввода в n списки вывода, сохраняя исходный порядок, вы можете сделать:

import math

def split_list(input_list, n):
    group_size = int(math.ceil(len(input_list)/float(n)))
    output_lists = [input_list[group_size*i:min((i+1)*group_size, len(input_list))] for i in range(n)]
    return output_lists

Используя тот же пример, что и выше, вы получите [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14]].

0 голосов
/ 10 сентября 2018

Это потому, что длина вашего списка IDList не делится на 4, оставляя подсписок в newlist только с 3 элементами, а когда вы zip подсписки, архивирование прекращаетсякогда какой-либо из входных итераторов исчерпан, в результате получается только 3 списка вместо 4. Вы можете заменить zip на itertools.izip_longest вместо (после импорта itertools), чтобы вывод был таким, как ожидалось.

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