3

假设我需要一个的元素,每个元素用空格分隔。此外,我需要第i 个元素为 a 1,其余元素为 a 0。最简单的pythonic方法是什么?

因此n = 10,如果 和i = 2,我想要 0 1 0 0 0 0 0 0 0 0

我想要一个new string[]你可以在 C++ 中获得的东西,但是 Python 版本让我望而却步。

谢谢!

4

5 回答 5

6

使用列表。

n = 10
i = 2

mylist = ["0"] * n
mylist[i-1] = "1"
print " ".join(mylist)
于 2012-05-08T22:57:36.620 回答
2

以下 Python 生成器表达式应生成您要查找的内容:

" ".join("1" if i == (x+1) else "0" for x in range(n))
于 2012-05-08T23:04:31.267 回答
1

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'
于 2012-05-08T23:16:42.837 回答
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从零开始进行调整。通常情况下,我不会那样做。在所有条件相同的情况下,我更喜欢始终使用从零开始的索引,除非输入和输出格式需要从一开始的值。在这种情况下,我会尽快转换输入并尽可能晚地转换输出,并且绝对避免将两者混合在同一段代码中。

您可以安全地删除方括号,将列表推导转换为生成器推导。对于大多数意图和目的,它们的工作方式相同。

于 2012-05-08T23:05:43.953 回答
0

只需使用“+”连接字符串:

("0 "*i + "1 " + "0 "*(n-i-1))[:-1]

或者你也可以使用字节数组:

a = bytearray(("0 "*n)[:-1])
a[i*2] = "1"
print str(a)
于 2012-05-08T23:07:42.387 回答