此代码基于我收到的对此问题的优雅答案,并按比例放大以接受最多 5 个元素的嵌套列表。总体目标是合并在索引位置 1 具有重复值的嵌套列表。
当 marker_array 中的嵌套列表有 4 个元素时,异常传递会抑制 IndexError。但是代码未能在最终输出中包含 4 个元素列表之后的最后一个列表。我的理解是 defaultdict 的目的是首先避免 IndexErrors。
# Nested list can have 4 or 5 elements per list. Sorted by [1]
marker_array = [
['hard','00:01','soft','tall','round'],
['heavy','00:01','light','skinny','bouncy'],
['rock','00:01','feather','tree','ball'],
['fast','00:35','pidgeon','random'],
['turtle','00:40','wet','flat','tail']]
from collections import defaultdict
d1= defaultdict(list)
d2= defaultdict(list)
d3= defaultdict(list)
d4= defaultdict(list)
# Surpress IndexError due to 4 element list.
# Add + ' ' because ' '.join(d2[x])... create spaces between words.
try:
for pxa in marker_array:
d1[pxa[1]].extend(pxa[:1])
d2[pxa[1]].extend(pxa[2] + ' ')
d3[pxa[1]].extend(pxa[3] + ' ')
d4[pxa[1]].extend(pxa[4] + ' ')
except IndexError:
pass
# Combine all the pieces.
res = [[' '.join(d1[x]),
x,
''.join(d2[x]),
''.join(d3[x]),
''.join(d4[x])]
for x in sorted(d1)]
# Remove empty elements.
for p in res:
if not p[-1]:
p.pop()
print res
输出几乎是我需要的:
[['hard heavy rock', '00:01', 'soft light feather ', 'tall skinny tree ', 'round bouncy ball '], ['fast', '00:35', 'pidgeon ', 'random ']]
由于我的技术水平,这个放大版肯定失去了一些原来的优雅。非常感谢任何有关改进此代码的一般指示,但我的两个主要问题按重要性排序是:
- 如何确保 ['turtle','00:40','wet','flat','tail'] 嵌套列表不被忽略?
- 我能做些什么来避免在“柔光羽毛”中出现尾随空白?