【问题标题】:python3 dictionary with duplicate keys but different values具有重复键但值不同的python3字典
【发布时间】:2018-03-31 12:53:38
【问题描述】:

我需要提交一个如下所示的表单数据:

evt: 2001
evt: 1024001
src: mstrWeb.my.fbb.fb.2001
src: mstrWeb.my.fbb.1024001

当我创建一个 python3 dict 时:

Dict = {'evt': '2001',
    'evt': '1024001',
    'src': 'mstrWeb.my.fbb.fb.2001',
    'src': 'mstrWeb.my.fbb.1024001'}

它按顺序删除重复的键。我明白了:

>>> print (Dict)
{'evt': '1024001', 'src': 'mstrWeb.my.fbb.1024001'}

有什么方法可以让我的 Dict 中的重复键完好无损?

【问题讨论】:

  • 字典不能有重复的键。您不能列出与“evt”键关联的所有值吗?
  • @Carcigenicate ,它基本上是我需要使用 requests.post 提交到 URL 的表单数据。不幸的是,这些值不能在列表中
  • 他们为什么不能呢?您不能拥有重复的密钥,因此您需要寻找不同的方式。为了获得更好的建议,您可能需要提供更多上下文来解释为什么该值不能是列表,因为这是简单的解决方法。
  • @Carcigenicate,我发出 POST 请求的主机 URL 不接受相同键的列表中的值
  • 但是您可以在提交请求之前从列表中取出值。如果您将其作为 JSON 提交,则无论如何也不能有重复的键。

标签: python python-3.x dictionary python-requests


【解决方案1】:

Python dicts 有唯一的键。没有办法解决这个问题。

一种方法可能是在 Python 中创建 defaultdict 列表,然后在表单代码中循环 jinga for 以迭代字典的值。

或者,如果您能够发送json 字符串,this workaround for handling duplicate keys 可能会有所帮助:

给定

data = [
    ("evt", "2001"),
    ("evt", "1024001"),
    ("src", "mstrWeb.my.fbb.fb.2001"),
    ("src", "mstrWeb.my.fbb.1024001")
]

代码

class Container(dict):
    """Overload the items method to retain duplicate keys."""

    def __init__(self, items):
        self[""] = ""
        self._items = items

    def items(self):
        return self._items


json.dumps(Container(data))
# '{"evt": "2001", "evt": "1024001", "src": "mstrWeb.my.fbb.fb.2001", "src": "mstrWeb.my.fbb.1024001"}'

【讨论】:

    【解决方案2】:

    这对我有用,我从这里拿的:Link

    class person(object):
            def __init__(self,name):
                    self.name = name
    
            # As it would print for a user
            def __str__(self):
                    return self.name
    
            # As it would print for a debugging person
            def __repr__(self):
                    return "'"+self.name+"'"
    
    
    Dict = {person('evt'): '2001',
            person('evt'): '1024001',
            person('src'): 'mstrWeb.my.fbb.fb.2001',
            person('src'): 'mstrWeb.my.fbb.1024001'}
    
    print (Dict) #outputs
    
    {'evt': '2001', 'evt': '1024001', 'src': 'mstrWeb.my.fbb.fb.2001', 'src': 'mstrWeb.my.fbb.1024001'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2012-10-22
      • 2022-08-18
      • 2013-05-07
      相关资源
      最近更新 更多