【问题标题】:Is there a better way to build this list有没有更好的方法来建立这个列表
【发布时间】:2014-01-24 07:07:22
【问题描述】:

我需要根据现有列表 JRstrt 的内容生成一个新列表 p。现有列表是:

JRstrt = [1,1,0,0,1,0,1,1]

创建新列表的规则是:

  • 在第一次通过时,JRstrt 中的每个 1 都向 p 添加一个序列号。序列计数器从第一个 1 的 1 开始,第二个 1 的 2 开始,依此类推。对于 JRstrt 中的每个 0,都会在 p 后面附加一个 0。
  • 在第二次传递中,JRstrt 中的每个 0 继续使用现有计数器将序列号添加到新列表中。

这是我当前的代码:

p = []
count = 1
for ind in JRstrt:
    if ind == 1:
        p.append(count)
        count += 1
    else:
        p.append(0)


for index, object in enumerate(p):
    if p[index] == 0:
        p[index] = count
        count += 1
    else:
        pass

print p

这种方法给了我我需要的结果,但是,我认为它有点笨拙。作为 Python 的菜鸟,我想对我的方法进行批评。非常感谢。

预期输出 [1, 2, 6, 7, 3, 8, 4, 5]

【问题讨论】:

  • 能否在您的帖子中发布该示例的预期输出?

标签: python list python-2.7


【解决方案1】:

这应该和你的代码做同样的事情:

In [42]: count = itertools.count(1)

In [43]: p = JRstrt[:]

In [44]: for i,num in enumerate(p):
   ....:     p[i] = next(count) if num==1 else num
   ....:     

In [45]: for i,num in enumerate(p):
    p[i] = next(count) if num==0 else num
   ....:     

In [46]: p
Out[46]: [1, 2, 6, 7, 3, 8, 4, 5]

进一步优化:

p = JRstrt[:] 替换为p = [next(count) if i else i for i in JRstrt]

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多