【问题标题】:Python : How to change from a like impulse list to a like saw tooth listPython:如何从类似的脉冲列表更改为类似的锯齿列表
【发布时间】:2018-01-12 01:43:33
【问题描述】:

我想将列表从喜欢冲动更改为喜欢锯齿。 请告诉我如何以有效的方式编写它。

# input list
list_a = [0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]

# output list
list_b = [0.0, 0.0, 1.0, 0.9, 0.8, 0.7, 1.0, 0.9, 0.8, 1.0, 0.9]

普通代码

我想知道如何写下代码的有效方式。 就像一个列表理解。

list_b = []
for i, val in enumerate(list_a):
    if i == 0:
        list_b.append(val)
    elif val == 1:
        list_b.append(float(val))
    elif list_b[-1] >= 0.1:
        list_b.append(list_b[-1] - 0.1)
    else:
        # list_b is not subtract under zero 
        list_b.append(0.0)

【问题讨论】:

  • “喜欢冲动”和“喜欢锯齿”是什么意思?
  • Tbh,我喜欢你的方法。我会从list_b = [list_a[0]] for val in list_a[1:]: if val == 1: 开始并使用round(list_b[-1] - 0.1, 1) 来消除浮点数的不准确性,否则我不会有太大的改变。

标签: python list iterator


【解决方案1】:

你可以试试这个:

import itertools
list_a = [0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]
new_data = list(map(lambda x:x[-1], [(a, list(b)) for a, b in itertools.groupby(list_a, key=lambda x:x == 1)]))
final_data = map(float, list(itertools.chain.from_iterable([list(map(lambda x:0.0 if x < 0 else x, [1-(0.1*c) for c in range(1, len(a)+1)])) if a[0] == 0 and new_data[i-1][0] == 1 and i > 0 else a for i, a in enumerate(new_data)])))

输出:

[0.0, 0.0, 1.0, 0.9, 0.8, 0.7, 1.0, 0.9, 0.8, 1.0, 0.9]

【讨论】:

  • 您是否喜欢以牺牲可读性为代价将所有内容塞进一行?
  • @cᴏʟᴅsᴘᴇᴇᴅ 我同意你的观点,但我认为这是 OP 的要求。
  • @cᴏʟᴅsᴘᴇᴇᴅ 这个解决方案没有被塞进一行,也不是不可读的。此外,正如 GarbageCollector 所指出的,OP 自己想要一个列表理解,“底层代码的有效方式。就像一个列表理解”
  • 我看不懂。有时,给 OP 他们想要的东西并不总是最好的做法,除非你只是回答分数。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我认为最好定制解决方案以使其与 OP 相关。
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多