假设我需要一个长的元素,每个元素用空格分隔。此外,我需要第i 个元素为 a 1
,其余元素为 a 0
。最简单的pythonic方法是什么?
因此n = 10
,如果 和i = 2
,我想要
0 1 0 0 0 0 0 0 0 0
我想要一个new string[]
你可以在 C++ 中获得的东西,但是 Python 版本让我望而却步。
谢谢!
使用列表。
n = 10
i = 2
mylist = ["0"] * n
mylist[i-1] = "1"
print " ".join(mylist)
以下 Python 生成器表达式应生成您要查找的内容:
" ".join("1" if i == (x+1) else "0" for x in range(n))
Python REPL 中的以下示例应该对您有所帮助。Python 生成器表达式" ".join(bin((1<<n)+(1<<n>>i))[3:])
应该是一个解决方案。
>>> n=10
>>> i=2
>>> " ".join(bin((1<<n)+(1<<n>>i))[3:])
'0 1 0 0 0 0 0 0 0 0'
这看起来像家庭作业,所以我将用英语而不是 Python 来描述我的答案。
使用列表推导创建n
字符串列表,从'1'
(如果项目的索引是i
)和'0'
(否则)中选择每个元素。将列表的元素连接起来,并在它们之间留一个空格。
您可以通过多种方式根据布尔值从两个项目中进行选择。其中一个是将两个项目放在一个序列中,并用布尔值索引序列,从而选择第一个元素 ifFalse
和第二个元素 if True
。在这种特殊情况下,您还可以将布尔值转换为'0'
或'1'
以多种方式(例如先转换为整数,然后再转换为字符串)。
我不明白new string[]
评论——那不是 C++ 语法。
编辑
这是Python:
' '.join([('0', '1')[x == i - 1] for x in range(n)])
或者
' '.join([str(int(x == i - 1)) for x in range(n)])
我更喜欢前者——很明显它会生成零和一,并且可以轻松地将它们更改为其他内容。它i - 1
不是i
针对i
从一开始和x
从零开始进行调整。通常情况下,我不会那样做。在所有条件相同的情况下,我更喜欢始终使用从零开始的索引,除非输入和输出格式需要从一开始的值。在这种情况下,我会尽快转换输入并尽可能晚地转换输出,并且绝对避免将两者混合在同一段代码中。
您可以安全地删除方括号,将列表推导转换为生成器推导。对于大多数意图和目的,它们的工作方式相同。
只需使用“+”连接字符串:
("0 "*i + "1 " + "0 "*(n-i-1))[:-1]
或者你也可以使用字节数组:
a = bytearray(("0 "*n)[:-1])
a[i*2] = "1"
print str(a)