Создать «динамический список» во время итерации в python - PullRequest
0 голосов
/ 15 ноября 2018

Фон

Пусть будет набор целых чисел

trialinteg = [231,355,112,1432,2434,5235,7896,7776,27421,42342]

Тогда их можно классифицировать по разным классам эквивалентности по модулю 6

Задача

Можем ли мы создать алгоритм для классификации всех этих целых чисел в соответствующий класс эквивалентности и сохранения результатов в словаре на python?

Например,

d = {"class0": [112,1432,..], "class1": [231,...], ...}

Что более важно, можем ли мы сделать d, чтобы изменить его размер и имена ключей, как целое число, с помощью которого мы определяем класс эквивалентности (в этом примере 6)?

Progress

Можно сохранить все целые числа класса эквивалентности 0 по модулю 6 в списке.Но не ясно, как можно создать «динамический» словарь, который регулирует его размер и имена ключа при изменении целого числа (например, от 6 до 121).

moduloclasszero=[]
for num in trialinteg:
    while num % 6 != 0:

        print(f"{num} is not of class 0")
        print(f"But {num} is of class {num % 6}")
        print("now proceed to restore it to 0")

        num = num + (6-(num % 6))
    else: 
        print(f"{num} is of class 0")
        moduloclasszero.append(num)

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вы можете использовать collections.defaultdict:

from collections import defaultdict

trialinteg = [231,355,112,1432,2434,5235,7896,7776,27421,42342]

d = defaultdict(list)

for x in trialinteg:
    d[f'class{x % 6}'].append(x)

print(d)
# defaultdict(<class 'list'>, {'class3': [231, 5235], 'class1': [355, 27421], 'class4': [112, 1432, 2434], 'class0': [7896, 7776, 42342]})
0 голосов
/ 15 ноября 2018

Используйте само значение класса для вашего словарного ключа.

my_mod = 6
for num in trialinteg:
    d[num % my_mod].append(num)

Я предполагаю, что вы уже можете справиться с инициализацией dict;если нет, посмотрите на дополнительные вопросы на этом сайте.

Диктовое понимание может сделать это в одном операторе присваивания:

trial = [231,355,112,1432,2434,5235,7896,7776,27421,42342]
d = {equi: [i for i in trial if i%my_mod == equi] 
     for equi in range(my_mod)}

Результирующее значение d:

{0: [7896, 7776, 42342],
 1: [355, 27421],
 2: [],
 3: [231, 5235],
 4: [112, 1432, 2434],
 5: [] }
...