【问题标题】:Comparing matching elements of a list in Python在 Python 中比较列表的匹配元素
【发布时间】:2020-11-20 08:53:15
【问题描述】:

例如,如何让一个列表中的第 5 项与另一个列表中的第 5 项匹配,然后在匹配时发送该结果?以下是 json 的示例:

{
  "List1": [
    "name1",
    "name2",
    "name3",
    "name4",
    "name5",
  ],
  "List2": [
    "emoji1",
    "emoji2",
    "emoji3",
    "emoji4",
    "emoji5",
  ]
}

字符在第二个列表中找到项目,我需要使其与第一个列表中的正确名称相对应。它们的顺序已经正确,因此第 5 个名称与第 5 个表情符号匹配。如果相关,我正在使用这种方法来查找玩家拥有的表情符号:

        scan = f"privatelink"
        async with aiohttp.ClientSession() as cs:
            async with cs.get(scan) as r:
                try: Bag = ast.literal_eval(await r.text())
                except: Bag = json.loads(await r.text())

那个 json 看起来像这样:

[{"emojis":"emoji10,emoji20,emoji11,emoji14,emoji30,,emoji9,emoji44,emoji53,emoji16,emoji48"}]

看起来很奇怪,我认为这实际上可能是我的问题。我不认为我以前见过这样的 json 和 Idk 如何解析它。

假设我拥有第二个列表中的“emoji5”。我想将它与第一个列表中的“name5”相匹配。如何匹配这些结果?

【问题讨论】:

    标签: python json list discord.py-rewrite


    【解决方案1】:

    我能够做到这一点:

            bag = bag[0]['items']
            emj = c['smiley']
            nam = c['words']
    
            for x in emj:
                if x in bag:
                    for x in [emj.index(x)]:
                        J = c['words'][x]
    

    我现在的问题是J 在分配给 Discord 嵌入字段时。名称或描述只是一次向每个使用不同嵌入的垃圾邮件。答案是正确的,但是我如何将每个单词放入它自己的字段中,或者拆分成它自己的描述部分,而不是为每个单词发送一个新的嵌入?我试过这个:

                        e = discord.Embed(title=f"Test", color=discord.Colour(value=), 
                        description=f'')
    
                        e.add_field(name=J, value=f"")
                        await ctx.send(embed=e)
    
    

    但它只是添加一个带有第一个结果的字段并发送嵌入,然后发送另一个带有下一个结果的嵌入,依此类推。顺便说一句,不要介意颜色值,我还在努力决定哈哈。

    【讨论】:

      【解决方案2】:

      不确定我是否理解您的问题...但如果您只是想匹配两个等长列表的对应元素,请使用zip

      import json
      data = json.loads("""
      {
        "List1": [
          "name1",
          "name2",
          "name3",
          "name4",
          "name5"
        ],
        "List2": [
          "emoji1",
          "emoji2",
          "emoji3",
          "emoji4",
          "emoji5"
        ]
      }
      """)
      
      print(dict(zip(data['List2'], data['List1'])))
      

      打印:

      {'emoji1': 'name1', 'emoji2': 'name2', 'emoji3': 'name3', 'emoji4': 'name4', 'emoji5': 'name5'}
      

      【讨论】:

      • 我想我可能认为我遇到了与实际不同的错误,我认为我的问题在于解析一个看起来像这样的 json:[{"emojis":"emoji10,emoji20,emoji11,emoji14,emoji30,,emoji9,emoji44,emoji53,emoji16,emoji48"}] 所以如果我拥有来自的emoji48 Bag json,对应于List2,我希望它给出List1 中第48 项的结果。对不起,如果我解释得不好。可能需要注意的是,它实际上并没有被称为 emoji48,所以我不能以实际名称作为代码的基础。
      【解决方案3】:

      您可以在列表中使用index() 来查找获取您正在搜索的项目的索引。但是,如果您经常这样做或者列表真的很长,这真的很昂贵。相反,您应该使用字典:

      x = {
          'emoji1': 'name1',
          'emoji2': 'name2',
          # etc.
      }
      

      现在您可以使用x['emoji1'] 快速查找数据。

      【讨论】:

      • @Brenda 不,你没有“必须”。我建议按照您构建列表的方式构建它。
      • @Brenda 所以看起来你的列表来自一些 JSON。 JSON 是如何构建的?它是来自 API 调用还是来自您控制的文件?如果它来自您无法控制的某个来源,那么我建议将列表列表转换为dict。我建议也看看zip() 函数。
      猜你喜欢
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多