【问题标题】:Python Dictionary: Key with two values possible?Python字典:可能有两个值的键?
【发布时间】:2018-05-23 20:00:20
【问题描述】:

对于一个测试程序,我正在抓取一个网页。我想抓取与各个城市相关联的特定 ID 的所有活动。

比如我的初始代码:

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

我现在想知道是否可以总结与例如相关的所有 ID(值)。伦敦成一键:

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)

有什么聪明的方法吗。感谢任何反馈。

【问题讨论】:

  • 你的意思是两个键的价值?
  • 你需要有一个key和多个values
  • “我现在想知道是否可以将所有与伦敦相关的 ID(值)汇总为一个键”,我真的不明白你的意思再问,你想用总和吗?一个元组?每个键都单独工作吗?
  • 你的意思是把它们相加还是这三个数字仍然被打破?
  • 我没有看到您在代码中使用的值(例如伦敦)。

标签: python dictionary beautifulsoup web-crawler


【解决方案1】:

您可以分两步完成:

  1. 创建将位置映射到 ID 列表的字典。
  2. 反转此字典,注意确保您的密钥是可散列的。

第一步通过collections.defaultdict进行优化处理。

对于第二步,您可以使用tuplefrozenset。我选择后者,因为不清楚排序是否相关。

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'}

【讨论】:

    【解决方案2】:

    你可以使用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'}
    

    【讨论】:

      【解决方案3】:

      您可以做一个从值到所有工作键的反向查找表,如下所示:

      def reverse(ids):
          table = {}
          for key in ids:
              if ids[key] not in table:
                  table[ids[key]] = []
              table[ids[key]].append(key)
          return table
      

      【讨论】:

      • 现在等待...您应该为此使用 setdefault 或 collections defaultdict。但这不是 OP 想要的。
      • @AntonvBR 那么 OP 想要什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2013-04-14
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多