【问题标题】:How to join mixed list (array) (with integers in it) in Python?如何在 Python 中加入混合列表(数组)(其中包含整数)?
【发布时间】:2012-12-19 14:13:28
【问题描述】:

我有一个混合列表(数组)

a = ["x", "2", "y"]
b = ["x", 2, "y"]
print ":".join(a)
print ":".join(b)

第一个连接有效,但第二个抛出 TypeError 异常

我想出了这个,但这是 Python 解决方案吗?

print ":".join(map(str, b))

顺便说一句,最后我只是想将此字符串写入文件,所以如果有特定的解决方案,我也会很感激。

【问题讨论】:

  • 是的,这可能是最 Pythonic 的方式。
  • 如果您喜欢简洁,可以使用 try/except 循环来规范化所有输入,然后再进行 joining 如果您(可以说)喜欢清晰。
  • 对我来说看起来很蟒蛇!
  • 一个关于术语的注释——你拥有的是一个list,而不是一个array。当人们说“数组”时,他们通常指的是numpy.ndarray,但也有一个内置的array 模块提供array 类型(只能保存同质数据)
  • @mgilson 以我的经验,当人们说“数组”时,他们通常指的是大多数语言中的数组是与语言无关的数据结构。

标签: python


【解决方案1】:

您的解决方案运行良好,可能是对中小型列表执行此操作的最快方法之一,但它创建了一个不必要的列表(在 python2.x 中)。通常这不是问题,但在少数情况下,取决于对象b,这可能是一个问题。另一个在 python2 和 python 3 中是惰性的是:

':'.join(str(x) for x in b)

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

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

请注意,如果您让循环变得更大,则差异会变得不那么重要:

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

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

*在我的 MacbookPro、OS-X 10.5.8 intel core2duo 上完成所有计时 ....

注意事项,

  • python2.x 在所有情况下都比 python3.x 快(对我来说)
  • 列表理解对于您的示例列表来说是最快的,但map 对于更大的列表来说更快。 map 对于小列表可能较慢,因为您需要查找函数,而列表理解不能被“隐藏”,因此不需要执行查找。 HUGE 列表可能还有另一个转折点,其中构建中间列表所需的时间变得很重要。
  • 生成器表达式总是最慢的(但在这两种情况下都是懒惰的)

【讨论】:

  • 如果你导入itertools.imap,你可以获得同样的性能提升:':'.join(imap(str, b))
  • @David -- imap 比生成器好,但在这个小例子中仍然比 map 差很多(它只在 python2.x 中可用)。 (还是)感谢你的建议。我已将其添加到计时中。
  • 如果您提出建议,我很乐意改进此答案 :-)
  • itertools.imap 仅在 python2 中可用,因为在 python 3 map itertools.imap,要找回旧的,您需要list(map(...))跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多