#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. Я обновил исходное сообщение примером. Спасибо, что взглянули!