将元组的字符串表示形式转换为dict

时间:2018-01-08 11:00:08

标签: python-3.x dictionary tuples

我的string代表tuple,如下所示:

t = "(a,b),(c,d),(e,f)"

我想把它转换成这样的字典:

d = {'a':'b', 'c':'d', 'e':'f'}

我尝试按照以下方式进行操作

>>> l = t.split(',')
>>> l
>>> ['(a', 'b)', '(c', 'd)', '(e', 'f)']

>>> l = [i.replace('(','').replace(')','') for i in l]
>>> l
>>> ['a', 'b', 'c', 'd', 'e', 'f']

>>> dict([(a,b) for a,b in zip(l[::2],l[1::2])])
>>> {'e': 'f', 'c': 'd', 'a': 'b'}

这给了我正确的结果(dict元素的顺序对我来说并不重要)。然而,这是低效的,因为它涉及三个步骤才能获得所需的输出。有没有办法在两个或理想的一个操作/声明中得到它?

1 个答案:

答案 0 :(得分:0)

正如我在评论中已经说过的那样:

  • 较少的代码并不总是意味着代码运行得更快。
  • 如果它不是性能关键,那么优化它并不是很重要。
  • 表现已经很快了。

但是,代码执行了一个冗余步骤:为什么在只需要从已知位置剥离一个字符时使用replace

这里我写了一些执行相同任务的函数。

导入随机

random.seed(1234)

def f():
    return ''.join(chr(random.randint(65,90)) for _ in range(100))

def g():
    return ','.join('({}, {})'.format(f(), f()) for _ in range(1000))

def ext(t):
    l = t.split(',')
    l = [i.replace('(','').replace(')','') for i in l]
    return dict([(a,b) for a,b in zip(l[::2],l[1::2])])

def ext2(t):
    l = t.split(',')
    return dict([(a[1:],b[:-1]) for a,b in zip(l[::2],l[1::2])])

def ext3(t):
    l = t.split(',')
    return {a[1:] : b[:-1] for a,b in zip(l[::2],l[1::2])}

def ext4(t):
    return dict(x.split(',') for x in t[1:-1].split('),('))

import timeit

t = g()
assert(ext(t) == ext2(t) == ext3(t) == ext4(t))

print(len(t))
print(timeit.timeit(lambda: ext (t), number=30))
print(timeit.timeit(lambda: ext2(t), number=30))
print(timeit.timeit(lambda: ext3(t), number=30))
print(timeit.timeit(lambda: ext4(t), number=30))

Try it online!

正如TIO所示,函数ext3在最短的时间内执行,与OP的原始函数ext相比,速度提高了2倍。

ext4并不比ext3快(尽管仍然比ext更快),因为它避免了replace,但它是一个声明。仅对代码高尔夫有用。实际上,有多少陈述并不重要。

运行上面代码的附加结果,因为答案应该是自包含的:

204999
0.05400996300159022
0.022308056009933352
0.02011037600459531
0.02612137998221442