将元组列表中的元素排序为两个单独的列表
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']
正如标题所说,我正在将标记元素分类到两个列表中。 我目前的代码是:
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']