Переберите список значений Dict и удалите элементы из этого списка - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть список словарей, как показано ниже:

Dict1 = [{'Title': 'Title1', 'Attributes':['name1.50', 'name2.40', 'name1.90']}, 
         {'Title': 'Title2', 'Attributes':['name2.90', 'name1.40', 'name1.90']}]

Я хочу перебрать этот словарь, а затем перебрать ключ 'Attributes' в каждом словаре, чтобы искать значения, начинающиеся с 'name1', а неимея .90 в нем, и удалите его из ключа 'Attributes'.

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

Dict1 = [{'Title': 'Title1', 'Attributes':['name1.90']}, 
         {'Title': 'Title2', 'Attributes':['name2.90', 'name1.90']}]

У меня логика итерации как

for item in Dict1:
    for name in item['Attributes']:
        if 'name1' in name:
            if name.split(".")[1] not '90':
                item['Attributes'].remove(name)

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

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019
def solve():
    array = [{'Title': 'Title1', 'Attributes':['name1.50', 'name2.40', 'name1.90']}, {'Title': 'Title2', 'Attributes':['name2.90', 'name1.40', 'name1.90']}]

    for item in array:
        new_names = []
        for name in item['Attributes']:
            if '90' in name: new_names.append(name)
            elif 'name1' not in name: new_names.append(name)
        item['Attributes'] = new_names
    print(array)

solve()

Выход: [{'Title': 'Title1', 'Attributes': ['name2.40', 'name1.90']}, {'Title': 'Title2', 'Attributes': ['name2.90', 'name1.90']}]

0 голосов
/ 02 февраля 2019

вы были очень близки к правильному ответу.В Python вы не можете манипулировать значениями в паре ключ / значение.Поэтому вместо этого я попробовал этот подход, и это привело бы к желаемому результату.

for x in Dict1:
    new_attributes = []
    print(x)
    for i in x['Attributes']:
        if i.split('.')[1] == '90':
            new_attributes.append(i)
    del x['Attributes'] #Not required. Can directly write the new list in the key
    x['Attributes'] = new_attributes

Это создает новый список, хранящий только те значения, которые вы хотите, удаляет старый ключ Attributes и создает новый сновый список.

0 голосов
/ 02 февраля 2019
  • name.split(".")[1] not '90' - синтаксическая ошибка, просто используйте !=.Python - это не только загадочный язык, состоящий из not, is, reduce, lambda ...
  • item['Attributes'].remove(name), когда вы выполняете итерации по элементам.Это подвержено ошибкам: вы можете пропустить некоторые элементы

Лучший способ - это перестроить ваш список словарей, используя понимание списка, и понимание слова с помощью фильтра для каждого слова:

Dict1 = [{'Title': 'Title1', 'Attributes':['name1.50', 'name2.40', 'name1.90']}, {'Title': 'Title2', 'Attributes':['name2.90', 'name1.40', 'name1.90']}]

new_dict_list = [{'Title':d['Title'], 'Attributes':[v for v in d['Attributes'] if v.endswith(".90")]} for d in Dict1]

результат:

[{'Attributes': ['name1.90'], 'Title': 'Title1'},
{'Attributes': ['name2.90', 'name1.90'], 'Title': 'Title2'}]

с одним меньшим пониманием:

new_dict_list = []
for d in Dict1:
    values = [v for v in d['Attributes'] if v.endswith(".90")]
    new_dict_list.append({'Title':d['Title'], 'Attributes':values})

v.endswith(".90") может быть 90 in v или not v.startswith('name1') and v.endswith('.90'), не уверен в точном условии, но я 'дам это читателю.

...