Сортировать массив массивов в группы по номеру группы - PullRequest
0 голосов
/ 24 октября 2018

У меня есть массив массивов.Я пытаюсь разделить их на 4 группы по 3 в каждой.Вот код ...

random.shuffle(top_twelve_players_info)
top_twelve_players_info_copy = top_twelve_players_info[:]

group_1 = []
group_2 = []
group_3 = []
group_4 = []

for i in range(3):
    group_1.append(top_twelve_players_info_copy[i])
    top_twelve_players_info_copy.remove(top_twelve_players_info_copy[i])
print(f"Group 1: {group_1}")

for i in range(3):
    group_2.append(top_twelve_players_info_copy[i])
    top_twelve_players_info_copy.remove(top_twelve_players_info_copy[i])
print(f"Group 2: {group_2}")

for i in range(3):
    group_3.append(top_twelve_players_info_copy[i])
    top_twelve_players_info_copy.remove(top_twelve_players_info_copy[i])
print(f"Group 3: {group_3}")

# print(top_twelve_players_info_copy)

for i in range(3):
    group_4.append(top_twelve_players_info_copy[i])
    # top_twelve_players_info_copy.remove(top_twelve_players_info_copy[i])
print(f"Group 4: {group_4}")

В настоящее время top_twelve_players_info выглядит как

[
    ['Krombopulos Michael', 10, 3],
    ['Scary Terry', 2, 11],
    ['Jerry Smith', 7, 6],
    ['Blim Blam ', 11, 2],
    ['Summer Smith', 1, 12],
    ['Tophat Jones', 5, 8],
    ['Beth Smith', 6, 7],
    ['Abradolf Lincler', 4, 9],
    ['Alan Rails', 12, 1],
    ['Morty Smith', 3, 10],
    ['Rick Sanchez', 9, 4],
    ['Xenon Bloom', 3, 10]
]

Я искал более эффективную реализацию вместо повторения циклов for икаким-то образом даже сделать переменные group_1 или group_2 в зависимости от номера итерации.Кроме того, по какой-то причине в текущей реализации я получаю ошибку «индекс списка вне диапазона» только при создании 4-й группы.Поэтому мне пришлось прокомментировать удаление строки.Почему это?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Ошибка, которую вы получаете, состоит в том, что вы изменяете список (удаляете элементы из него), пытаясь перебрать его по индексу (таким образом, индекс 2 больше не существует к тому времени, когда ваш цикл диапазона достигает этого значения в вашем последнемfor loop).

Вы можете упростить подход, просто нарезав случайно перемешанный список, используя цикл диапазона с шагами, эквивалентными размеру групп, которые вы хотите вывести.Ниже приведен подход, при котором результирующие группы помещаются в один список, а затем выводятся выходные данные, аналогичные вашему примеру.

import random

top_twelve_players_info = [['Krombopulos Michael', 10, 3], ['Scary Terry', 2, 11], ['Jerry Smith', 7, 6], ['Blim Blam ', 11, 2], ['Summer Smith', 1, 12], ['Tophat Jones', 5, 8], ['Beth Smith', 6, 7], ['Abradolf Lincler', 4, 9], ['Alan Rails', 12, 1], ['Morty Smith', 3, 10], ['Rick Sanchez', 9, 4], ['Xenon Bloom', 3, 10]]

random.shuffle(top_twelve_players_info)
groups = [top_twelve_players_info[i:i+3] for i in range(0, 12, 3)]

for i, group in enumerate(groups):
    print(f'Group {i + 1}: {group}')

# EXAMPLE OUTPUT (differs based on random shuffle results)
# Group 1: [['Beth Smith', 6, 7], ['Scary Terry', 2, 11], ['Krombopulos Michael', 10, 3]]
# Group 2: [['Xenon Bloom', 3, 10], ['Rick Sanchez', 9, 4], ['Tophat Jones', 5, 8]]
# Group 3: [['Morty Smith', 3, 10], ['Abradolf Lincler', 4, 9], ['Jerry Smith', 7, 6]]
# Group 4: [['Summer Smith', 1, 12], ['Alan Rails', 12, 1], ['Blim Blam ', 11, 2]]

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

[group_1, group_2, group_3, group_4] = [top_twelve_players_info[i:i+3] for i in range(0, 12, 3)]

print(f'Group 1: {group_1}')
print(f'Group 2: {group_2}')
print(f'Group 3: {group_3}')
print(f'Group 4: {group_4}')
0 голосов
/ 24 октября 2018

Придерживаясь стандартной библиотеки Python (вместо pandas, которая обеспечила бы гораздо более элегантное решение), вы, вероятно, должны пойти так:

from collections import defaultdict
groups = defaultdict(list)

players_cnt = 0
for group_no in range(4):
    for player_cnt in range(3):
        selected_player = top_twelve_players_info_copy[players_cnt]
        groups[group_no].append(selected_player)  # here defaultdict makes it more elegant - we do not need to check if group_no is a key in groups

Теперь, если вам действительно нужно, вы можете извлечь группы дляотдельные переменные (но я бы настоятельно рекомендовал сохранить их в словаре с указанием номера группы):

group_1 = groups[1]  # ...etc.
...