类型错误:只能加入可迭代的Python错误

时间:2017-07-27 16:56:51

标签: python typeerror iterable

首先,我已经查看了同一主题的这些帖子:

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。 这意味着什么,我该如何解决?

4 个答案:

答案 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