我有一个混合的列表(数组)
a = ["x", "2", "y"]
b = ["x", 2, "y"]
print ":".join(a)
print ":".join(b)
Run Code Online (Sandbox Code Playgroud)
第一个连接有效,但第二个连接会引发TypeError异常
我想出了这个,但这是Python解决方案吗?
print ":".join(map(str, b))
Run Code Online (Sandbox Code Playgroud)
BTW最后我只想将这个字符串写入一个文件,所以如果有一个特定的解决方案,我也会很感激.
mgi*_*son 11
您的解决方案运行良好,可能是中小型列表执行此操作的最快方法之一,但它创建了一个不必要的列表(在python2.x中).通常这不是问题,但在少数情况下,取决于对象b,这可能是一个问题.另一个在python2和python 3中很懒的是:
':'.join(str(x) for x in b)
Run Code Online (Sandbox Code Playgroud)
python 2.7.3的一些时间:
$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
1000000 loops, best of 3: 1.66 usec per loop
$python -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
1000000 loops, best of 3: 1.49 usec per loop
$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.26 usec per loop
$python -m timeit -s 'from itertools import imap; b = ["x", 2, "y"]' '":".join(imap(str,b))'
100000 loops, best of 3: 2.83 usec per loop
Run Code Online (Sandbox Code Playgroud)
python3.2的一些时间:
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
100000 loops, best of 3: 2.6 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
100000 loops, best of 3: 2.08 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.39 usec per loop
Run Code Online (Sandbox Code Playgroud)
请注意,如果让循环变得更大,差异就变得不那么重要了:
python2.7.3:
$ python -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 4.83 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 4.33 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 3.29 msec per loop
Run Code Online (Sandbox Code Playgroud)
python 3.2.0
$ python3 -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 6.42 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 5.51 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 4.55 msec per loop
Run Code Online (Sandbox Code Playgroud)
*所有时间都在我的MacbookPro,OS-X 10.5.8 intel core2duo上完成....
笔记,
map对于更大的列表来说速度更快. map因为你需要查找函数而小列表的速度可能较慢,而列表推导不能被"遮蔽",因此不需要执行查找.对于HUGE列表可能存在另一个转向点,其中构建中间列表所花费的时间变得非常重要.