Оценка в два или больше списка

У людей по DimeCasts.net есть хорошее учебное руководство .

TeamCity

5
задан Rince 28 September 2009 в 11:24
поделиться

9 ответов

Попробуйте

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 () и который сортируется на несколько списков.

4
ответ дан 18 December 2019 в 07:55
поделиться
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 и инициализируйте добавляет в другие пустые списки.

2
ответ дан 18 December 2019 в 07:55
поделиться

Я бы выбрал подход Эдана, например

equal = [arg for arg in arguments if '=' in arg]
plain = [arg for arg in arguments if '=' not in arg]
2
ответ дан 18 December 2019 в 07:55
поделиться

Для этого можно использовать 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)
4
ответ дан 18 December 2019 в 07:55
поделиться

Я бы просто пошел на два понимания списка. Хотя это влечет за собой некоторые накладные расходы (два цикла в списке), для Pythonic лучше использовать понимание списка, чем использовать for. Кроме того, (на мой взгляд) это гораздо более читабельно, чем использование всевозможных действительно крутых уловок, но о которых мало кто знает.

3
ответ дан 18 December 2019 в 07:55
поделиться

Я где-то здесь читал, что вас может заинтересовать решение, которое будет работать для больше , чем два идентификатора (знак равенства и пробел).

Следующее решение требует всего лишь обновления набора уникальных пользователей с все, что вы хотите сопоставить, результаты помещаются в словарь списков с идентификатором в качестве ключа.

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 .)

2
ответ дан 18 December 2019 в 07:55
поделиться

Другой подход - использовать функцию 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']
1
ответ дан 18 December 2019 в 07:55
поделиться

Я собрал все это вместе и затем вижу, что Нед Батчелдер уже придерживался того же пути. Однако я предпочел упаковать метод разделения вместо средства выбора списка и просто использовать неявные значения 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)
1
ответ дан 18 December 2019 в 07:55
поделиться

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

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)
1
ответ дан 18 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: