【问题标题】:string of kwargs to kwargs一串kwargs到kwargs
【发布时间】:2012-02-16 04:06:08
【问题描述】:

我有一个类似

的字符串
s = "title='bah' name='john and jill' purple='haze' none=None i=1"

我正在寻找一种将其放入字典的 Python 方式(以及一种不会因多余空格而窒息的解决方案)?

建议?

【问题讨论】:

  • 如果其中一个键/值包含“=”字符,您可能会遇到问题
  • 它不会......我可以控制人们使用什么。
  • 如果你有complete control,那么你可以使用eval("dict(%s)" % s.replace(' ',',') ),但不要告诉任何人我告诉过你的

标签: python python-2.5


【解决方案1】:
>>> from ast import literal_eval
>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> dict((k, literal_eval(v)) for k, v in (pair.split('=') for pair in s.split()))
{'purple': 'haze', 'i': 1, 'none': None, 'name': 'john', 'title': 'bah'}

(如果内部字符串包含空格,或者'=' 显示为键值分隔符以外的任何内容,则此方法将不起作用。显然,这越复杂,解析就越困难,所以...)

【讨论】:

  • 嘿 Nix,这将是正确的做法。很简单。
  • 无法导入 AST 这是 python 2.5
【解决方案2】:

如果您可以控制字符串,正如您所说的那样,您可以简单地这样做

>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> eval("dict(%s)"%s.replace(" ",","))
{'i': 1, 'purple': 'haze', 'none': None, 'name': 'john', 'title': 'bah'}
>>> 

【讨论】:

  • 需要注意的是,这会改变带有空格的参数("title='foo bar' name='john'" -> {'name': 'john', 'title': 'foo,bar'})。
【解决方案3】:
>>> dictionary = {}
>>> for i in s.split():
...     dictionary[i.split('=')[0]] = i.split('=')[1]
...
>>> dictionary
{'purple': "'haze'", 'i': '1', 'none': 'None', 'name': "'john'", 'title': "'bah'"}

【讨论】:

    【解决方案4】:

    看起来@Nix 在上一个答案中错过了对 split() 的调用。

    以下是更正后的代码:

    >>> s = "title='bah' name='john' purple='haze' none=None i=1"
    >>> d = eval("dict(%s)" % ','.join(s.split()))
    >>> d
    {'i': 1, 'purple': 'haze', 'none': None, 'name': 'john', 'title': 'bah'}
    >>>
    

    否决票很可能是因为他的原始代码:

    s = "title='bah' name='john' purple='haze' none=None i=1"
    d = eval("dict(%s)"% ",".join(s))
    

    产生以下错误:

    >>> s = "title='bah' name='john' purple='haze' none=None i=1"
    >>> d = eval("dict(%s)"% ",".join(s))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 1
        dict(t,i,t,l,e,=,',b,a,h,', ,n,a,m,e,=,',j,o,h,n,', ,p,u,r,p,l,e,=,',h,a,z,e,', ,n,o,n,e,=,N,o,n,e, ,i,=,1)
                       ^
    SyntaxError: invalid syntax
    

    【讨论】:

    • 这应该作为对原始答案的评论或编辑。
    【解决方案5】:

    @gnibblers 和 @RanRag 的组合,不会对空格产生影响。 (例如,title='foo bar')

    s = "title='bah' name='john' purple='haze' none=None i=1"
    d = eval("dict(%s)"% ",".join(s.split()))
    

    【讨论】:

    • 我(心)匿名投反对票。有人可以向我解释为什么我可以修复吗?
    【解决方案6】:
    from operator import methodcaller
    from ast import literal_eval
    kv_split = methodcaller('split', '=', 1)
    {k: literal_eval(v) for k, v in map(kv_split, s.split(" "))}
    # {'purple': 'haze', 'i': 1, 'none': None, 'name': 'john', 'title': 'bah'}
    

    【讨论】:

      猜你喜欢
      • 2012-04-09
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2020-09-16
      • 2017-01-28
      • 2011-07-12
      相关资源
      最近更新 更多