【问题标题】:python: processing a 16-element list into an 8-element listpython:将16个元素的列表处理成8个元素的列表
【发布时间】:2010-01-25 20:38:43
【问题描述】:

我有一个包含 16 个元素的列表 [a00,a01,a02,...,a15] 并且想计算一个列表 [b0,b1,b2,b3,b4,b5,b6,b7] 其中

b0 = a00*256+a01
b1 = a02*256+a03
b2 = a04*256+a05
(etc.)

最简单的方法是什么? (我是python初学者)

【问题讨论】:

  • 如果一个问题的答案是“列表理解”是关于 Python 的最常见的问题,那么第二个更常见的是“我如何将一个序列分解成块”?这个问题两者都有!见,例如stackoverflow.com/questions/2095637

标签: python list


【解决方案1】:

b_list = [a_list[2*i] * 256 + a_list[2*i+1] for i in range(8)]

请注意,这只适用于 a 有 16 个元素的情况。

更通用的解决方案是:

b_list = [a_list[2*i] * 256 + a_list[2*i+1] for i in range(len(a_list) / 2)]

只要a_list 有偶数个元素。

【讨论】:

  • 哦。我得到它。你不是说 [a_list[2*i] * 256 + a_list[2*i+1] for i in range(8)]
  • for i in range(len(a_list) / 2) 适用于每个偶数组合;)
  • @Jason S - 是的,这就是我的意思 :) 已修复。
【解决方案2】:

不要太高调,但如果你想避免下标地狱,你可以使用这个方便的zip idiom:

a = range(16)
b = [x*256+y for x,y in zip(*[iter(a)]*2)]

【讨论】:

  • 这是如何工作的? (困惑)我查看了docs.python.org/library/functions.html#zip 并了解了基础知识,但 * 和 iter 的东西很奇怪。
  • 它在 a 上创建一个包含两个迭代器的列表。星号表示以下列表的元素将用作函数调用的参数。所以两个相同的迭代器被用作 zip 的参数。所以每个迭代器只是交替从列表中获取元素。
  • @Jason 是的,这是一个看起来很棘手的成语,但我发现它非常有用。 recursive 在他的解释中大部分是正确的,但我必须建议你通过代码来真正理解它,我第一次看到它时同样感到困惑,并且发现它非常有益。
  • 我同意值得弄清楚。请参阅我对此的看法:telliott99.blogspot.com/2010/01/… 另外,请参阅有关为什么应该使用 itertools 来执行此操作的问题:stackoverflow.com/questions/2095637
【解决方案3】:

你可以做一个理解列表...

a = [a00, a01,.... ]
#Readed, take a list with 0,2,4... len(a) [15, will stop at 14]
# then make a[i]*256 + a[i+1], so
# a[0]*256+a[1], a[2]*256+a[3], ... a[14]*256+a[15]
b = [ a[i]*256+a[i+1] for i in range(0,len(a),2) ]

【讨论】:

  • 看来大家都快...而且想法一样:-D
  • 只是好奇,为什么在发布时间显示相反的情况下,这显示为最旧?
  • @Adam Bernier:啊,不知道编辑也算在内。虽然,在我发布该评论时,MAK 的答案尚未被编辑并且也表现出相同的行为
  • @danben:当您第一次编辑答案时,回答时间已更改为编辑时间。在 meta 上,您可能会找到更多关于如何“合并”编辑的信息。
【解决方案4】:
lst = [a01, a02, ... ]
result = [256 * a + b for a, b in zip(lst[::2], lst[1::2])]

这避免了range 的非pythonic 使用。

【讨论】:

  • 你能解释一下 :: 在这种情况下吗?
  • 这些是切片语法。它开始:结束:步骤。负索引从列表末尾开始计数。任何省略的元素都匹配 0:-1:1。因此, ::2 将返回列表中的所有其他元素。
【解决方案5】:

首先想到的是:

>>> a=range(16)
>>> b=[a[i]*256+a[i+1] for i in range(0,len(a),+2)]
[1, 515, 1029, 1543, 2057, 2571, 3085, 3599]

【讨论】:

  • OP 的问题中没有指定版本,但是 xrange 在 Python 3 上不起作用。
  • 是的,python 3 中的 range 在 Python 2 中将与 xrange 一样工作。“旧”range,创建完整列表在 Python 3 中消失了,如果你想创建一个列表你需要这样做:list(range)
  • @AJ:编辑了删除 xrange 的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2018-01-09
相关资源
最近更新 更多