将元组列表中的元素排序为两个单独的列表

Sorting elements from a list of tuples into two separate lists

正如标题所说,我正在将标记元素分类到两个列表中。 我目前的代码是:

lst = [("foo", "good"), ("bar", "bad")...("x", "n")]

def sort(items):
    good = []
    bad = []
    for i in range(len(items)):
        if items[i][1] == 'good':
            good += items[i][0]
        else:
            bad += items[i][0]
    return good, bad


alpha, beta = sort(lst)

我的输出只是f。我一直在努力解决这个问题,但解决方案一直在躲避我。 有什么建议吗?

谢谢大家

您可以修复您的代码:

def sort(items):
    good = []
    bad = []
    for x, y in items:
        if y == 'good':
            good.append(x)
        else:
            bad.append(x)
    return good, bad

请注意,+= 对应于 list.extend,它按元素添加可迭代对象。对于逐字符表示字符的字符串。

+= 当您尝试将 LHS 添加到具有相同数据类型的 RHS 时使用。当您执行 good += items[i][0] 时,就像将 foo 作为列表 (['f', 'o', 'o']) 添加到列表 good 中。这就是您看到该行为的原因。因此使用 list.append() 将元素添加到列表中。 试试这个:

lst = [("foo", "good"), ("bar", "bad"), ("head", "good"), ("tails", "bad")]

def sort(items):
    good = []
    bad = []
    for item in items:
        #print (item, type(item))
        if item[1] == 'good':
            good.append(item[0])
        else:
            bad.append(item[0])
    return good, bad


alpha, beta = sort(lst)
print (alpha, beta)

输出:

['foo', 'head'] ['bar', 'tails']

我刚把good += items[i][0]改成了good.append(i[0])

lst = [("foo", "good"),("bar", "bad"),("x", "n")]

def sort(items):
    good = []
    bad = []
    for i in items:
        if i[1] == 'good':
            good.append(i[0])
        else:
            bad.append(i[0])
    return good, bad


alpha, beta = sort(lst)
print(alpha)
print(beta)

输出:

['foo']
['bar', 'x']

您的代码没问题,但您需要更改一件事:

items[i][0] -> [items[i][0]]

当您想使用 + 时,您需要将值作为列表:

>>> [2,3] + [4]
[2,3,4]

您的代码只需更改一处:

lst = [("foo", "good"), ("bar", "bad"), ("head", "good"), ("tails", "bad")]

def sort(items):
    good = []
    bad = []
    for item in items:
        if item[1] == 'good':
            good += [item[0]]
        else:
            bad += [item[0]]
    return good, bad


alpha, beta = sort(lst)
print (alpha, beta)

输出:

['foo', 'head'] ['bar', 'tails']

您可以尝试使用 list comprenhension 计算两个列表以更简洁的方式解决此问题:

def sort(items):
    good = [item[0] for item in items if item[1] == 'good']
    bad = [item[0] for item in items if item[1] == 'bad']

    return good, bad

如果 性能 不是问题,这可能会更好,因为它是 声明式 方法而不是 命令式 一个这样可以更容易阅读,但考虑到它会重复列表两次。

希望对您有所帮助!

要创建带有映射或过滤的新列表,使用 列表理解 比在循环中调用 .append 通常更短且更容易阅读:

data = [("foo", "good"), ("bar", "bad"), ("head", "good"), ("tails", "bad"), ("x", "n")]

good_lst = [x for x,quality in data if quality == 'good']
bad_lst = [x for x,quality in data if quality != 'good']

print(good_lst)
# ['foo', 'head']
print(bad_lst)
# ['bar', 'tails', 'x']