2 Вопрос: Как перебрать ключ и значение в словарь на основе того, что уже есть в словаре

вопрос создан в Wed, May 8, 2019 12:00 AM

Я пытаюсь продублировать словарь несколько раз, основываясь на значении подвыборок в словаре test1.

test1={'Subsamples':3}
test2={'Substrate':0,'Incubation Time':0}
test3={'Colonies':0,'Color':0,'Size':0}

if test1['Subsamples']>0:
    for x in range(0,test1['Subsamples']):
        #Magic happens here

print (test1)
>>>{'Subsamples':3}
print (test2)
>>>{'Substrate1':0,'Incubation Time1':0,'Substrate2':0,'Incubation Time2':0,'Substrate3':0,'Incubation Time4':0}
print(test3) 
>>>{'Colonies1':0,'Color1':0,'Size1':0,'Colonies2':0,'Color2':0,'Size2':0,'Colonies3':0,'Color3':0,'Size3':0}

Таким образом, в приведенном выше примере значение ключа Subsamples равно трем, поэтому словарь «копируется» 3 раза с числом, добавляемым в конец каждого ключа на каждой итерации.

    
0
2 ответа                              2                         

Похоже, что вы хотите сделать, это:

def dict_mult(d, n): 
     assert n >= 0 
     ret = {} 
     for i in range(n): 
         for k, v in d.items(): 
             ret['%s%s' % (k, i+1)] = v 
     return ret 

Тем не менее, это выглядит как странная вещь ... Созданный вами диктат выглядит сложным для обработки остальной частью вашей программы (необходимость создавать ключи с конкатенацией строк).

Вы уверены, что не должны создавать что-то вроде

{('Colonies',1):0,('Color',1):0,('Size',1):0,('Colonies',2):0,('Color',2):0,('Size',2):0,('Colonies',3):0,('Color',3):0,('Size',3):0}

или даже лучше

[
  {'Colonies':0,'Color':0,'Size':0},
  {'Colonies':0,'Color':0,'Size':0},
  {'Colonies':0,'Color':0,'Size':0},
]

?

Позднее существо легко производит [dict(test3) for _ in range(n)] р>     

0
2019-05-08 15: 59: 44Z
  1. Ага, `` `{('Colonies', 1): 0, ('Color', 1): 0, ('Size', 1) : 0, ( 'Колонии', 2): 0, ( 'Color', 2): 0, ( 'Размер', 2): 0, ( 'Колонии', 3): 0, ( 'Цвет', 3) : 0, ('Size', 3): 0} `` `Гораздо лучше. Как мне это сделать?
    2019-05-08 16: 09: 25Z
  2. Да, первая предложенная вами альтернатива выглядит намного лучше. Я пытаюсь это реализовать, но мне сложно разобраться.
    2019-05-08 18: 43: 29Z
  3. просто замените "%s%s" % (k, i+1) на (k, i+1) в функции dict_mult в моем ответе:)
    2019-05-09 17: 10: 48Z
  4. Большое спасибо! Вы настоящий MVP LOL
    2019-05-09 18: 02: 08Z

Вы можете использовать my_dict.items(), чтобы перебирать ключи и значения в одно и то же время.

Вот один из способов ответа:

test1 = {'Subsamples': 3}
test2 = {'Substrate': 0, 'Incubation Time': 0}
test3 = {'Colonies': 0, 'Color': 0, 'Size': 0}

def create_new_dict(dict_number, dict_to_apply):
    new_dict = {}
    size = dict_number['Subsamples']
    if size > 0:
        for x in range(0, size):
            for key, value in dict_to_apply.items():
                new_dict[key + str(x+1)] = value
    return new_dict


print(create_new_dict(test1, test2))
# {'Substrate1': 0, 'Incubation Time1': 0, 'Substrate2': 0, 'Incubation Time2': 0, 'Substrate3': 0, 'Incubation Time3': 0}
print(create_new_dict(test1, test3))
# {'Colonies1': 0, 'Color1': 0, 'Size1': 0, 'Colonies2': 0, 'Color2': 0, 'Size2': 0, 'Colonies3': 0, 'Color3': 0, 'Size3': 0}
    
0
2019-05-08 16: 01: 52Z
источник размещен Вот