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



我有一个tuplestring表示形式如下:

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元素的顺序对我来说并不重要(。但是,这是低效的,因为它涉及三个步骤才能获得所需的输出。有没有办法在两个或理想情况下一个操作/语句中做到这一点?

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

  • 更少的代码并不总是意味着代码运行得更快。
  • 如果它不是性能关键型的,那么优化这一点就不是很重要。
  • 性能已经相当快了。

但是,代码执行一个冗余步骤:当您只需要从您已经知道的位置剥离一个字符时,为什么要使用 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))

在线试用!

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

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

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

204999
0.05400996300159022
0.022308056009933352
0.02011037600459531
0.02612137998221442

最新更新