def bucketsort(arr, k):
counts = [0] * k
for x in arr:
counts[x] += 1
sorted_arr = []
for i, count in enumerate(counts):
sorted_arr.extend([i] * count)
return sorted_arr
有人可以解释一下这种语法吗?
1)
counts = [0] * k
2)
中的for i, count
for i, count in enumerate(counts):
sorted_arr.extend([i] * count)
在python中只有列表和词典?没有array \ queues \ stack?
答案 0 :(得分:3)
[0] * k
评估为包含k
元素的列表,每个元素为0
。
[i] * count
评估为包含count
元素的列表,每个元素为i
。
文档的相关部分位于:Sequence Types
for i, count in enumerate(counts):
enumerate
函数返回一个产生元组的迭代器。每个元组都包含一个索引以及counts
中的关联项。所以你的代码相当于:
i = 0
for count in counts:
#do something with i and count
i += 1
答案 1 :(得分:1)
[0]*k
这意味着包含k
- s的尺寸0
的列表。这适用于任何序列对象,例如:
"foo"*2
请考虑以下语法:
for i, value in enumerate(values):
pass
这利用了Python的两个属性。第一种是for
语法,在某些其他语言中的作用类似于foreach
。例如,以下内容将循环3次,i
第一次为0
,第二次为1
,第三次为2
:
for i in [0,1,2]:
pass
第二个是价值拆包。给定序列类型,您可以将其值解包为不同的变量:
i, j = (42, 69, )
运行此行后,i
将保留42
,j
将保留69
。顺便说一下,这是一个元组,它是一个不可变的(即你不能改变它)序列。
最后,函数enumerate
接受一个序列并返回一个元组序列,其中第一个元素是索引号,第二个元素是该索引处的序列值。好吧,确切地说,它需要一个可顺序的对象并返回一个迭代器,但差别相同。
所以,基本上,通过使用该语法,您可以获得索引和值。好的。
您有一个列表([1, "fish", 2, "fish", "red", "fish", "blue", "fish"]
),一个dict({'one': 2, 2: 'three'}
),一个元组((one, [1,2], three, )
)和一个集合({"one", 3, (1,2)}
,Python 2.7语法)。你也有一个冷冻集,它是一个不可变的集合,没有语法糖。
请参阅Python documentation for built-in types。
然后标准collections
package中还有一些容器类型。还有一些data types in other places in the standard library。
此外,您可以将标准列表用作堆栈或队列。并且不要让array
包欺骗你 - 你不使用它来实现数组(你使用普通列表),你用它来导入二进制数据。它是struct
包的伴侣。
答案 2 :(得分:0)