Как я могу просмотреть два списка, найти совпадения и извлечь связанные строки из одного из них?

#python-3.x #list #if-statement #printing #boolean

#python-3.x #Список #if-оператор #печать #логическое

Вопрос:

Допустим, у меня есть адресная книга, заполненная 30 адресами, и с ними не связаны имена. Я хочу узнать, кто где живет, поэтому я также получил желтые страницы, в которых должны быть эти адреса и связанные имена каждого жителя.

Переведи это на Python (3 ), как я могу найти имена на желтых страницах и связать их с моими 30 адресами в новый список, который возвращает как имя, так и адрес?

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

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

 for name in yellowPages:
    for address in addressBook:
        if address == address in specificPage:
            print(name, "'s address is: "   address)
  

Обновление: вот пример вложенного списка, с которым я работаю:

 {
  "State": {
    "City": [
      {
        "County": {
          "name": "AAA",
          "address": "123 ABC",
          "zip_code": "111",
        }
      }
    ]
  }
}
  

Прямо сейчас у меня есть:

 phone_book = {'state': {'city': [{'county': {'name': 'AAA', 'address': 'ZZZ', 'zip_code': 'GGG', 'thing': 'EFG', 'chicken': 'CLUCK', 'alien': 'ET', 'car': 'BMW'}}, {'city': [{'county': {'name': 'BBB', 'address': 'YYY', 'zip_code': 'HHH', 'thing': 'TBH', 'chicken': 'CHICK', 'alien': 'BOB', 'car': 'LEXUS'}}, {'city': [{'county': {'name': 'CCC', 'address': 'XXX', 'zip_code': 'III', 'thing': 'POP', 'chicken': 'HEN', 'alien': 'GARY', 'car': 'TOYOTA'}}]}]}]}}

address_book = ['AAA', 'BBB', 'FFF', 'PPP', 'RRR']


for value in phone_book['state']['city']:
    for name in address_book:
        if value['county']['name'] == name:
            print("value['county']['address']: "   value['county']['address'])
            print("It's a match! name: "   name   " value['county']['name']: "   value['county']['name'])
            print("value['county']['zip_code']: "   value['county']['zip_code'])
            if value['county']['thing'] is None: 
                print("value['county']['thing']: None")
            else:
                print("value['county']['thing']: "   value['county']['thing'])
            if value['county']['chicken'] is None:
                print("value['county']['chicken']: None")
            else:
                print("value['county']['chicken']: "   value['county']['chicken'])
            if value['county']['alien'] is None:
                print("value['county']['alien']: null")
            else:
                print("value['county']['alien']: "   value['county']['alien'])
            print("value['county']['car']: "   value['county']['car'])
        else:
            print("value['county']['address']: "   value['county']['address']   value['county']['name']   " does't match anything")
  

И я получаю следующие выходные данные / ошибки:

 value['county']['address']: ZZZ
It's a match! name: AAA value['county']['name']: AAA
value['county']['zip_code']: GGG
value['county']['thing']: EFG
value['county']['chicken']: CLUCK
value['county']['alien']: ET
value['county']['car']: BMW
value['county']['address']: ZZZAAA does't match anything
value['county']['address']: ZZZAAA does't match anything
value['county']['address']: ZZZAAA does't match anything
value['county']['address']: ZZZAAA does't match anything
Traceback (most recent call last):
  File "testing.py", line 11, in <module>
    if value['county']['name'] == name:
KeyError: 'county'
  

Ответ №1:

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

Я заменю «имена» на простые буквы и «адреса» на простые числа.

Если у вас есть телефонная книга, в которой связаны имена и адреса:

phone_book = [('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6), ('h', 7), ('i', 8), ('j', 9), ('k', 10), ('l', 11), ('m', 12)]

и ваша адресная книга, которая содержит только адреса: address_book = [8, 5, 5, 5]

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

 for address in address_book:
    for (letter,number) in phone_book:
        if address == number:
            print(letter   "'s address is: "   str(address))
  

Этот цикл выведет:

 i's address is: 8
f's address is: 5
f's address is: 5
f's address is: 5
  

Комментарии:

1. Я ценю вашу помощь! Является ли концепция такой же, если один из моего списка вложен дальше, чем другой? Я продолжаю возиться с этим, но пока сталкиваюсь с несколькими различными ошибками.

2. По сути, да! основное соображение заключается в том, что по мере того, как каждый из ваших списков становится более вложенным, вам нужно включать больше for циклов для итерации по каждому последующему вложенному циклу. @jeng

Ответ №2:

Чтобы продолжить ваш комментарий о дополнительных вложенных списках:

Представьте, что теперь у вас phone_book есть вложенные списки, которые указывают разные окрестности.

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

 phone_book = [[('a', 0),('aa',10),('aaa',100)], [('b', 1),('bb',11),('bbb',111)], [('c', 2), ('cc', 22), ('ccc', 222)]]

address_book = [0, 11, 3, 22]

for address in address_book:
    for neighborhood in phone_book:
        for (letter,number) in neighborhood:
            if address == number:
                print(letter   "'s address is: "   str(address))
  

Дополнительный цикл for теперь позволяет сканировать каждый подсписок и проверять каждый элемент по отдельности (примечание 3 есть, address_book но нет phone_book , поэтому для него ничего не печатается, и цикл продолжается до следующего элемента address_book .

Комментарии:

1. Спасибо! Это действительно помогает, но я думаю, что есть еще часть, которую я все еще не совсем понимаю. У меня есть список, который включает / включает вложенные списки примерно за 4/5 шагов. (Извините, не совсем уверен, как это объяснить) но, по сути, мой результат заканчивается разными «именами», но все они связаны с одним и тем же «адресом». Есть идеи?

2. Хммм, возможно, это связано с тем, как структурированы ваши списки. Есть ли шанс, что вы можете привести пример?

3. Я обновил исходное сообщение примером. Спасибо, что взглянули!