我的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
元素的顺序对我来说并不重要)。然而,这是低效的,因为它涉及三个步骤才能获得所需的输出。有没有办法在两个或理想的一个操作/声明中得到它?
答案 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))
正如TIO所示,函数ext3
在最短的时间内执行,与OP的原始函数ext
相比,速度提高了2倍。
ext4
并不比ext3
快(尽管仍然比ext
更快),因为它避免了replace
,但它是一个声明。仅对代码高尔夫有用。实际上,有多少陈述并不重要。
运行上面代码的附加结果,因为答案应该是自包含的:
204999
0.05400996300159022
0.022308056009933352
0.02011037600459531
0.02612137998221442