As the title says I'm in the process of sorting tagged elements into two lists. My current code for this is:
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)
My output is simply f
. I've been trying to work this out for a while but the solution has been eluding me.
Any suggestions?
Thank you all.
CodePudding user response:
You can fix your code:
def sort(items):
good = []
bad = []
for x, y in items:
if y == 'good':
good.append(x)
else:
bad.append(x)
return good, bad
Note that =
corresponds to list.extend
which adds iterables element-wise. For strings that means char by char.
CodePudding user response:
To create new lists with mapping or filtering, it's often shorter and easier to read to use list comprehensions rather than calling .append
in a loop:
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']
CodePudding user response:
You can try to solve this in a cleaner way using list comprenhension
to compute both lists:
def sort(items):
good = [items[idx][0] for idx in range(0,len(items)) if items[idx][1] == 'good']
bad = [items[idx][0] for idx in range(0,len(items)) if items[idx][1] == 'bad']
return good, bad
If performance is not an issue this could be better due to it is a declarative approach instead of an imperative one so it could be easier to read, but takes into account that it iterates the list twice.
Hopes it helps you!
CodePudding user response:
Your code is fine, but you need to change one thing:
items[i][0] -> [items[i][0]]
When you want to use
you need to have values as list:
>>> [2,3] [4]
[2,3,4]
Your code with one change:
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)
Output:
['foo', 'head'] ['bar', 'tails']
CodePudding user response:
=
is used when you try to add LHS
to RHS
with same datatype. When you do good = items[i][0]
it's like adding foo
as a list (['f', 'o', 'o']
) to the list good
. That's the reason you see the behavior. Hence use list.append()
to add element to a list.
Try out this:
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)
Output:
['foo', 'head'] ['bar', 'tails']
CodePudding user response:
I just changed good = items[i][0]
to 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)
Output:
['foo']
['bar', 'x']