Словарь Python: ключ с двумя значениями возможно? - PullRequest
0 голосов
/ 23 мая 2018

Для тестовой программы я сканирую веб-страницу.Я хотел бы сканировать все виды деятельности для указанных идентификаторов, связанных с соответствующими городами.

Например, мой исходный код:

RegionIDArray = {522: "London", 4745: "London", 2718: "London", 3487: "Tokio"}

Теперь мне интересно, возможно ли этоСуммируйте все идентификаторы (значения), связанные, например, с Лондоном, в один ключ:

RegionIDArray = {522, 4745, 2718: "London}

Если я пытаюсь это сделать, я не получаю результатов

Мой полный код пока

RegionIDArray = {522: "London", 4745: "London", 2718: "London", 3487: "Tokio"}

for reg in RegionIDArray:
    r = requests.get("https://www.getyourguide.de/-l" +str(reg) +"/")
    soup = BeautifulSoup(r.content, "lxml")

    g_data = soup.find_all("span", {"class": "intro-title"})
    for item in g_data:
        POI_final = (str(item.text))

        end_final = ("POI: " + POI_final)
        if end_final not in already_printed:
           print(end_final)
           already_printed.add(end_final)

Есть ли какой-нибудь умный способ. Цените любые отзывы.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы можете сделать это в 2 шага:

  1. Создать местоположение сопоставления словаря со списком идентификаторов.
  2. Обратитесь к этому словарю, следя за тем, чтобы ваши ключи могли хэшироваться.

Первый шаг оптимально обрабатывается с помощью collections.defaultdict.

. Для второго шага вы можете использовать tuple или frozenset.Я выбираю последнее, так как не ясно, что порядок важен.

from collections import defaultdict

RegionIDArray = {522: "London", 4745: "London", 2718: "London", 3487: "Tokio"}

d = defaultdict(list)

for k, v in RegionIDArray.items():
    d[v].append(k)

res = {frozenset(v): k for k, v in d.items()}

print(res)

{frozenset({522, 2718, 4745}): 'London',
 frozenset({3487}): 'Tokio'}
0 голосов
/ 23 мая 2018

Вы можете использовать itertools.groupby:

import itertools
RegionIDArray = {522: "London", 4745: "London", 2718: "London", 3487: "Tokio"}
new_results = {tuple(c for c, _ in b):a for a, b in itertools.groupby(sorted(RegionIDArray.items(), key=lambda x:x[-1]), key=lambda x:x[-1])}

Выход:

{(3487,): 'Tokio', (4745, 522, 2718): 'London'}
0 голосов
/ 23 мая 2018

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

def reverse(ids):
    table = {}
    for key in ids:
        if ids[key] not in table:
            table[ids[key]] = []
        table[ids[key]].append(key)
    return table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...