Как проверить список значений словаря в Python 2? - PullRequest
0 голосов
/ 11 июня 2018

Здравствуйте, у меня есть список строк и список словарей

Я хочу сравнить мой список строк со списком значений словаря.Например:

# List of strings
my_list = ['john', 'james', 'joey']

# List of dictionary
results = [{name: 'john', age: 20}, {name: 'james', age: 25}]

# This is my code and its wrong.
for name in my_list:
# getting error here that said 'list indices must be integers, not unicode'
   if name is not in results['name']:

       # I want to add joey here
       new_person = {
           'name' = 'joey',
           'age' = 30
       }
       results.append(new_person)

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Предполагая, что у вас не будет повторяющихся имен в my_list или в results.Вы можете использовать set() для упрощения любых операций пересечения, которые вы хотите использовать:

# List of strings, Preferably convert this to a set
my_list = set(['john', 'james', 'joey'])

# List of dictionary
results = [{name: 'john', age: 20}, {name: 'james', age: 25}]

names_in_list = set([result['name'] for result in results])
names_to_add = names_in_list ^ my_list  # This returns the difference between the two sets

# Add each of the names to the list
for name in names_to_add:
    new_person = {
        'name': name,
        'age': 30   
    }
    results.append(new_person)

Простой способ сделать это - проверить каждый элемент в списке словарей на наличие в my_listследующим образом:

my_list = ['john', 'james', 'joey']
names_in_list = [result['name'] for result in results]
for name in my_list:
    if name not in names_in_list:
        # Add the name to the results list
        new_person = {
            'name': name,
            'age' : 30
        }
        results.append(new_person)

Результат выглядит следующим образом:

[{'age': 20, 'name': 'john'},
 {'age': 25, 'name': 'james'},
 {'age': 30, 'name': 'joey'}]
0 голосов
/ 11 июня 2018

@ Mark , здесь я показал 3 способа решения проблемы.Пожалуйста, проверьте это и дайте мне знать, удовлетворяет ли это вашей проблеме или нет с некоторым набором новых входов и ожидаемых выходов.Я буду обновлять код, основываясь на этом.

Первый способ - используя понимание списка, extended (), set ()

попробуйте его онлайн на http://rextester.com/WEE27295.

# List of strings
my_list = ['john', 'james', 'joey']

# List of dictionaries
results = [{"name": 'john', "age": 20}, {"name": 'james', "age": 25}]

new_persons = [{"name": name, "age": 30} for name in set(my_list) if name not in set((person["name"] for person in results))];
results.extend(new_persons);

print(results)

"Вывод

[{'age': 20, 'name': 'john'}, {'age': 25, 'name': 'james'}, {'age': 30, 'name': 'joey'}]   

" Второй способ - использование set ()

Попробуйте онлайн на http://rextester.com/WBAT64136.

# List of strings
my_list = ['john', 'james', 'joey']

# List of dictionaries
results = [{"name": 'john', "age": 20}, {"name": 'james', "age": 25}]
unique_names = set((person["name"] for person in results));

for name in my_list:
   if name not in unique_names:
       new_person = {
           'name': name,
           'age': 30
       }
       results.append(new_person);

print(results)

& "Вывод

[{'age': 20, 'name': 'john'}, {'age': 25, 'name': 'james'}, {'age': 30, 'name': 'joey'}]

" Третий способ - использование вложенных циклов

Попробуйте онлайн в http://rextester.com/DSB44497.

# List of strings
my_list = ['john', 'james', 'joey']

# List of dictionaries
results = [{"name": 'john', "age": 20}, {"name": 'james', "age": 25}]

for name in my_list:
 found = False;
 for person in results:
     if person["name"] == name:
          found = True

 if not found:
     new_person = {
         'name': name,
         'age': 30
     }
     results.append(new_person);

print(results)

"Выход

[{'name': 'john', 'age': 20}, {'name': 'james', 'age': 25}, {'name': 'joey', 'age': 30}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...