【问题标题】:Values in python dictionary getting converted to double quotes rather than single quotespython字典中的值被转换为双引号而不是单引号
【发布时间】:2020-10-02 20:28:52
【问题描述】:

我有一本包含以下值的字典:-

test_dict = {'a': ['a1', 'a2'], 'b': ['1.1.1.1:1111', '2.2.2.2:2222', '3.3.3.3:3333,4.4.4.4:4444', '5.5.5.5:5555']}

我需要将 3.3.3.3:33334.4.4.4:4444 之间的逗号 (,) 替换为 (',),这与其他逗号一样(单引号逗号空格)。

我尝试了下面的代码,但输出带有双引号 (")

val = ','
valnew = '\', \''  # using escape characters - all are single quotes
for k, v in test_dict.items():
    for i, s in enumerate(v):
        if val in s:
           v[i] = s.replace(val, valnew)

print(test_dict)

输出:

{'a': ['a1', 'a2'], 'b': ['1.1.1.1:1111', '2.2.2.2:2222', "3.3.3.3:3333', '4.4.4.4:4444", '5.5.5.5:5555']}

预期输出:

{'a': ['a1', 'a2'], 'b': ['1.1.1.1:1111', '2.2.2.2:2222', '3.3.3.3:3333', '4.4.4.4:4444', '5.5.5.5:5555']}

请提出建议。

【问题讨论】:

  • '3.3.3.3:3333,4.4.4.4:4444' 是一个字符串。也许您在最初编写列表的内容中存在错误?这些列表中的任何一个都可能有问题,还是总是列出索引 2?
  • 谢谢! @tdelaney。字典中没有错误。我们获得此组合的来源与我在问题中发布的相同。
  • 这能回答你的问题吗? How to split strings inside a list by whitespace characters。您只需使用逗号而不是空格:line.split(',')

标签: python python-3.x string repr


【解决方案1】:

print 正在显示字典的 representation,就好像调用了 print(repr(test_dict))

[repr返回] 一个字符串,其中包含一个对象的可打印表示。对于许多类型,此函数会尝试返回一个字符串,该字符串在传递给 eval() 时会产生具有相同值的对象。..

由于该值是一个包含' 的字符串,它在字符串表示 期间使用"。示例:

print(repr("helloworld"))   # -> 'helloworld'
print(repr("hello'world"))  # -> "hello'world"

这种表示一般仅用于诊断目的。如果需要编写这种特殊格式,则必须遍历字典并“按要求”显式打印值。

如果希望获得具有明确定义的序列化规则的可靠输出/编码,请使用 JSON、XML、YAML 等通用格式。

【讨论】:

    【解决方案2】:

    您将数据与表示混淆了。单引号、空格和逗号', '列表中字符串表示的一部分,而不是字符串本身。

    你实际上想要做的是用逗号分割一个字符串,例如

    >>> '3,4'.split(',')
    ['3', '4']
    

    您可以通过拆分和展平在列表中执行此操作,如下所示:

    [s1 for s0 in v for s1 in s0.split(',')]
    

    所以:

    >>> b = ['1', '2', '3,4', '5']  # Using simpler data for example
    >>> b = [s1 for s0 in b for s1 in s0.split(',')]
    >>> print(b)
    ['1', '2', '3', '4', '5']
    

    【讨论】:

    • 感谢您的解释。这真的很有帮助。了解数据和表示之间的区别。
    【解决方案3】:

    '3.3.3.3:3333,4.4.4.4:4444' 是单个字符串,外部引号只是 python 的显示方式。 "3.3.3.3:3333', '4.4.4.4:4444" 也一样——它是一个字符串。外部双引号只是 python 向您显示字符串的方式。内部的单引号和逗号实际上就是字符串中的那些字符。

    您的问题似乎是列表中的某些值已被合并。问题可能是首先写了这个列表。我们可以通过拆分字符串并扩展列表来修复它。将没有嵌入逗号的列表项目拆分为单个项目列表,因此将其作为单个项目扩展到我们的新列表中。不用找了。但是带有逗号的项目会拆分为 2 项目列表并将新列表扩展 2。

    test_dict = {'a': ['a1', 'a2'], 'b': ['1.1.1.1:1111', '2.2.2.2:2222', '3.3.3.3:3333,4.4.4.4:4444', '5.5.5.5:5555']}
    
    def list_expander(alist):
        """Return list where values with a comma are expanded"""
        new_list = []
        for value in alist:
            new_list.extend(value.split(","))
        return new_list
    
    new_dict = {key:list_expander(val) for key, val in test_dict.items()}
    print(new_dict)
    

    结果是

    {'a': ['a1', 'a2'], 'b': ['1.1.1.1:1111', '2.2.2.2:2222', '3.3.3.3:3333', '4.4.4.4:4444', '5.5.5.5:5555']}
    

    【讨论】:

    • 再次感谢。这真的很有帮助。也谢谢你的解释。
    【解决方案4】:

    试试这样的:

    test_dict["b"] = ",".join(test_dict["b"]).split(",")
    

    更新:

    import re
    
    # do this once for the entire list
    do_joinsplit_regex = re.compile(
        r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,4}"
    )
    
    for d in sample_list:
        for k,v in d.items():
            if not isinstance(v, list) or len(v) < 1:
                continue
            d[k] = ",".join(v).split(",")
    
    

    【讨论】:

    • 为什么加入只是为了再次分裂?
    • 因为问题是该列表中的一个元素实际上应该是两个,并且处理它的快速方法是将其与列表的其他元素连接或“加入”。如果你用逗号分割那个字符串,你将拥有所有条目。至于引号问题,我很抱歉。我正在使用移动应用程序,它不如我的电脑键盘可靠。随意编辑它!
    • 好的,我为你修正了引号。当我在那里时,我注意到理解是多余的,所以我也将其删除。现在更短了! :)
    • 谢谢!另外,我应该说我的移动设备键盘不如我的电脑键盘可靠。
    • 感谢 will_f 和 wjandrea。这看起来又短又甜:)。就像一个魅力。
    猜你喜欢
    • 2017-01-17
    • 2011-05-18
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多