【问题标题】:String to dict parsing without commas不带逗号的字符串到字典解析
【发布时间】:2018-10-22 15:16:55
【问题描述】:

有一个奇怪的字符串表示,比如

“key1:value1:key2:value2:key3:value3...keyn:valuen”

我需要创建一个字典,当你有逗号时它很容易解决,但是这里只有冒号,你必须每隔一个冒号拆分一次字符串。带有循环或类似的代码看起来很丑,所以我想知道你是否可以帮助我使用oneliner。

【问题讨论】:

  • 1.你试过什么? 2. 值里面可以有:吗?

标签: python string parsing dictionary


【解决方案1】:

你可以只用冒号分割,get an iterator 分割标记,zip 迭代器本身。这将很好地配对键和值:

s = 'key1:value1:key2:value2:key3:value3:keyn:valuen'
it = iter(s.split(':'))
dict(zip(it, it))
# {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'keyn': 'valuen'}

【讨论】:

  • 使用iter的好主意!
【解决方案2】:

如果您对 iter(以及我认为更好的 schwobaseggls 解决方案)感到不舒服,您可以以几乎相同的方式使用压缩列表切片:

s = 'key1:value1:key2:value2:key3:value3:keyn:valuen'
splitted = s.split(':')

# even_elements = splitted[::2]   - take every 2nd starting at 0th index
# odd_elements  = splitted[1::2]  - take every 2nd startIng at 1st index
k = {k:v for k,v in zip(splitted[::2],splitted [1::2]) }
print(k) 

输出:

{'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'keyn': 'valuen'}

或者,您可以手动创建字典:

s = 'key1:value1:key2:value2:key3:value3:keyn:valuen'
splitted = s.split(':')
d ={}

# this generates 2-slices from the list and puts them into your dict
for k,v in (splitted[i:i+2] for i in range(0,len(splitted),2)):
    d[k] = v

# or d = { k:v for k, v in (splitted[i:i+2] for i in range(0,len(splitted),2) )}
# or d = dict(splitted[i:i+2] for i in range(0,len(splitted),2) )

print(d)

输出:

{'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'keyn': 'valuen'}

【讨论】:

  • 您也可以在第二种方法中简单地在生成器上调用dict
  • @schwobaseggl 你是对的 :) dict(..) 甚至不会抱怨列表不可散列,要记住这一点
  • 如果它产生完全相同的dict,为什么会这样。字典中的 keys 必须是可散列的,但是我们提供给构造函数的这些列表切片不是键,而是键值对。
猜你喜欢
  • 1970-01-01
  • 2014-12-18
  • 2012-01-09
  • 2011-02-20
  • 2020-07-30
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多