Сортировка элементов из списка кортежей в два отдельных списка

#python #list #sorting #tuples

Вопрос:

Как говорится в заголовке, я в процессе сортировки помеченных элементов в два списка. Мой текущий код для этого таков:

 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 . Я пытался разобраться в этом некоторое время, но решение ускользало от меня. Есть какие-нибудь предложения?

Спасибо вам всем.

Комментарии:

1. good.append(... вместо =

2. Я исправил это почти сразу же, как только опубликовал этот вопрос, изменив good = items[i][0] его на good = [items[i][0]] «но спасибо за ваш ответ».

3. Я очень настоятельно советую не называть вашу функцию sort , потому что все, кто читает ваш код, используя эту функцию, будут считать, что она выполняет a sort в универсальном значении этого слова в информатике. То есть, что он делает то же самое, что и встроенная функция sorted или как list.sort .

4. Спасибо. Я изменил название только для этого вопроса, название в реальной программе другое.

Ответ №1:

Вы можете исправить свой код:

 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 тому, что добавляет итеративные элементы по элементам. Для строк это означает символ за символом.

Ответ №2:

Для создания новых списков с сопоставлением или фильтрацией часто бывает проще и проще читать, чтобы использовать понимание списка, а не вызывать .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']  

Ответ №3:

Вы можете попытаться решить эту проблему более чистым способом, используя 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  

Если производительность не является проблемой, это может быть лучше, поскольку это декларативный подход, а не императивный, чтобы его было легче читать, но учитывается, что он повторяет список дважды.

Надеюсь, это вам поможет!

Комментарии:

1. Не будет ли это медленнее, если он дважды пройдет по списку?

2. @Severin12121 Я думаю, что это будет зависеть от размера списка, потому list comprehension что обычно они быстрее становятся обычными for-loops . Я обновил ответ, чтобы уточнить этот вопрос и почему в некоторых случаях это может быть лучше (просто для удобства чтения).

3. Я думаю, что было бы более читабельно и более эффективно выполнять итерацию непосредственно по элементам, а не по индексам!

4. Да, это правда! Я отредактирую ответ, чтобы изменить его!

Ответ №4:

Ваш код в порядке, но вам нужно изменить одну вещь:

 items[i][0] -gt; [items[i][0]]  

Когда вы хотите использовать , вам нужно иметь значения в виде списка:

 gt;gt;gt; [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']  

Ответ №5:

= используется при попытке добавить 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']  

Ответ №6:

Я только что переоделся 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']