【问题标题】:Python Problem with generating a list with information from another list使用来自另一个列表的信息生成列表的 Python 问题
【发布时间】:2020-01-07 20:28:36
【问题描述】:

我想用 python 生成一个基于另一个列表的信息的列表。以下示例应演示我要传输哪些信息:

给出以下列表:

list_a=[0,0,0,0,0,0,0,0,0,1,2,3,4,0,0,0,0,1,2,0,0,0,0,1,2,3,4,5,0,0,0]

那么,我要生成的列表应该是这样的:

list_b=[0,0,0,0,0,0,0,0,0,4,3,2,1,0,0,0,0,2,1,0,0,0,0,5,4,3,2,1,0,0,0]

我是这样开始的:

list_b=[]
list_b = [0] * list_a.__len__()         #create a list of nulls
for i in range (list_a.__len__()):
       if list_a(i)!=0:
            if list_a(i+1)=0:
                 list_b.insert(i-(list_a[i]-1),list_a[i])

但是后来我只将第一个元素插入到 list_b 并且仍然需要插入所有后续元素(例如插入 4 并且仍然需要插入 3、2、1)并且解决方案/代码似乎太乱了。

有人知道优雅的解决方案吗?

【问题讨论】:

  • 所以你想保持零在同一个位置并反转非零整数?
  • 我想用 python 生成一个基于另一个列表中的信息的列表。 这到底是什么意思?我们如何帮助您完成一项我们几乎一无所知的任务?! #create a list of nulls 如果要表示类似 null 的内容,请使用 None。
  • @AMC 显然这里的 null 并不意味着 None 而是零(可以理解,尤其是当一个来自德国时)。
  • @StefanPochmann 你可能是对的,是的。
  • @AMC 对不起,我的意思是零,而不是零!我希望这些信息足以理解剩下的任务

标签: python list generate


【解决方案1】:

按零分组并反转每个组。

>>> [x for _, g in itertools.groupby(list_a, bool) for x in list(g)[::-1]]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 5, 4, 3, 2, 1, 0, 0, 0]

【讨论】:

  • 我喜欢你的 groupby 解决方案。 +1。这是扁平化列表列表的另一种方法: sum([[*g[1]][::-1] for g in groupby(list_a, bool)], [])
  • @VladBezden 是的,我也写了一个sum 版本,但我不喜欢它来证明效率低下。
【解决方案2】:

不太确定它的优雅/效率,但以下是您的解决方案:

list_a = [0,0,0,0,0,0,0,0,0,1,2,3,4,0,0,0,0,1,2,0,0,0,0,1,2,3,4,5,0,0,0]
list_b = []
reverse_list = []

for i in list_a:
    if i == 0:
        if reverse_list:
            list_b += reverse_list[::-1]
            reverse_list.clear()
        list_b.append(i)
    else:
        reverse_list.append(i)
# If list ended without encountering zero
list_b += reverse_list[::-1]

print(list_a)
print(list_b)

输出为:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 5, 4, 3, 2, 1, 0, 0, 0]

【讨论】:

  • 太好了,谢谢!我是初学者,这对我有很大帮助
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2019-10-18
  • 2020-07-09
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多