#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
, потому что все, кто читает ваш код, используя эту функцию, будут считать, что она выполняет asort
в универсальном значении этого слова в информатике. То есть, что он делает то же самое, что и встроенная функция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']