У людей по DimeCasts.net есть хорошее учебное руководство .
TeamCity
Попробуйте
for arg in arguments:
lst = equal if '=' in arg else plain
lst.append(arg)
или (черт возьми)
for arg in arguments:
(equal if '=' in arg else plain).append(arg)
Третий вариант: создайте класс, который предлагает append ()
и который сортируется на несколько списков.
def which_list(s):
if "=" in s:
return 1
return 0
lists = [[], []]
for arg in arguments:
lists[which_list(arg)].append(arg)
plain, equal = lists
Если у вас есть другие типы данных, добавьте предложение if в which_list
и инициализируйте добавляет
в другие пустые списки.
Я бы выбрал подход Эдана, например
equal = [arg for arg in arguments if '=' in arg]
plain = [arg for arg in arguments if '=' not in arg]
Для этого можно использовать itertools.groupby ()
:
import itertools
f = lambda x: '=' in x
groups = itertools.groupby(sorted(data, key=f), key=f)
for k, g in groups:
print k, list(g)
Я бы просто пошел на два понимания списка. Хотя это влечет за собой некоторые накладные расходы (два цикла в списке), для Pythonic лучше использовать понимание списка, чем использовать for. Кроме того, (на мой взгляд) это гораздо более читабельно, чем использование всевозможных действительно крутых уловок, но о которых мало кто знает.
Я где-то здесь читал, что вас может заинтересовать решение, которое будет работать для больше , чем два идентификатора (знак равенства и пробел).
Следующее решение требует всего лишь обновления набора уникальных пользователей
с
все, что вы хотите сопоставить, результаты помещаются в словарь списков
с идентификатором в качестве ключа.
uniques = set('= ')
matches = dict((key, []) for key in uniques)
for arg in args:
key = set(arg) & uniques
try:
matches[key.pop()].append(arg)
except KeyError:
# code to handle where arg does not contain = or ' '.
Теперь в приведенном выше коде предполагается, что у вас будет только одно совпадение для вашего идентификатора.
в вашем arg
. Т.е. у вас нет arg
, который выглядит так 'John = equalspace'
.
Вам также нужно будет подумать о том, как вы хотели бы обрабатывать случаи, которые не соответствуют ничему в наборе (возникает KeyError
.)
Другой подход - использовать функцию filter
, хотя это не самое эффективное решение.
Пример:
>>> l = ['a=s','aa','bb','=', 'a+b']
>>> l2 = filter(lambda s: '=' in s, l)
>>> l3 = filter(lambda s: '+' in s, l)
>>> l2
['a=s', '=']
>>> l3
['a+b']
Я собрал все это вместе и затем вижу, что Нед Батчелдер уже придерживался того же пути. Однако я предпочел упаковать метод разделения вместо средства выбора списка и просто использовать неявные значения 0/1 для False и True.
def split_on_condition(source, condition):
ret = [],[]
for s in source:
ret[condition(s)].append(s)
return ret
src = "z=1;q=2;lady jane;y=a;lucy in the sky".split(';')
plain,equal = split_on_condition(src, lambda s:'=' in s)
Ваш подход самый лучший. Для сортировки всего на два списка не может быть яснее этого. Если вы хотите, чтобы он был однострочным, заключите его в функцию:
def classify(arguments):
equal, plain = [], []
for arg in arguments:
if '=' in arg:
equal.append(arg)
else:
plain.append(arg)
return equal, plain
equal, plain = classify(lst)