首先,我已经查看了同一主题的这些帖子:
TypeError: can only join an iterable python
"Can only join an iterable" python error
"Can only iterable" Python error
python error-can only join an iterable
但遗憾的是,他们似乎都没有回答我的问题。我想获取一个列表,并按大小对所有非-1值进行排序,然后将-1返回到它们的原始位置。这是我的代码:
def sortByHeight(a):
treeLocations = []
for everyHeight in a:
if everyHeight == -1:
treeLocations.append([(len(a)-a.index(everyHeight)), (a.index(everyHeight)-1)])
a.remove(-1)
people = sorted(a)
for everyPair in treeLocations:
one = everyPair[1]
two = everyPair[0]
people[one:two] = -1
return(people)
sortByHeight([-1, 150, 190, 170, -1, -1, 160, 180])
我的代码抛出错误:TypeError:只能在第11行分配一个iterable。 这意味着什么,我该如何解决?
答案 0 :(得分:0)
要直接解决您所问的问题,您正在尝试将单个元素分配给切片(这需要可迭代)。在您的示例中清理一些内容,您可能会执行以下操作:
def sortByHeight(a):
# Get indices of all -1's
treeLocations = [index for index, height in enumerate(a) if height == -1]
# Get list of all others
people = [height for height in a if height != -1]
# Sort list of others
people = sorted(people)
# Re-insert -1's
for everyIndex in treeLocations:
people.insert(everyIndex, -1)
return(people)
答案 1 :(得分:0)
一般不从列表中删除您正在迭代的项目是一个好主意,如果您不小心,可能会导致意外结果。见Remove items from a list while iterating。正如John Machin所说,这有点像锯掉你所坐的树枝。 ;)
此外,从列表中删除项目效率不高:必须从头开始扫描列表,直到找到匹配的项目,然后当项目被删除时,所有后续项目都必须向下移动以填满差距。执行过滤操作会更好,从您希望保留的项目构建新列表。
这是执行该排序的一种相当有效的方法。诀窍是提取我们想要排序的项目,对它们进行排序,然后构建一个列表,将已排序的项目放入适当的位置。
jQuery("#course").on("select2-selecting", function (evt) {
jQuery('#events-table tr.hidden-course').removeClass('hidden-course');
jQuery('#events-table tr:not(".'+evt.val+'-event")').addClass('hidden-course');
if (evt.val == '') {
jQuery('#events-table tr').removeClass('hidden-course');
}
});
<强>输出强>
def sortByHeight(seq):
''' sort `seq`, leaving any items equal to -1 in place '''
# Extract items != -1
a = [u for u in seq if u != -1]
a.sort()
it = iter(a)
result = []
for u in seq:
result.append(u if u == -1 else next(it))
return result
data = [-1, 150, 190, 170, -1, -1, 160, 180]
print(data)
result = sortByHeight(data)
print(result)
答案 2 :(得分:0)
分配的目标是列表的 slice 。如果要为切片分配值,它必须是Python可以迭代的东西 - 列表,元组和字符串都是“iterables”的例子。所以
people[one:two] = [-1]
将使用单个元素-1
替换切片中的元素。您可以在交互式解释器中轻松测试:
>>> my_list = [1, 2, 3, 4, 5]
>>> my_list[2:3] = ['a', 'b', 'c']
>>> my_list
[1, 2, 'a', 'b', 'c', 4, 5]
>>> my_list[2:3] = -1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>>
如果你想用-1
替换所有元素,那么一个可能的公式将使用列表乘法来给出一个正确长度的序列:
people[one:two] = [-1] * (two-one)
答案 3 :(得分:0)
除了我在评论中提到的错误,如果您希望以更简单的方式执行此操作,请尝试以下操作:
def sortByHeight(a):
result = sorted(v for v in a if v != -1) # first sort all non -1 fields
for i, v in enumerate(a): # enumerate and iterate over the original list
if v == -1: # if the current value is -1
result.insert(i, -1) # put it back into the sorted list at its original position
return result