Гибкое разбиение входной строки в функции Python - PullRequest
0 голосов
/ 11 октября 2018

В Python, какой будет самый элегантный способ преобразования этой структуры:

['group1, group2, group3']

в эту структуру:

['group1', 'group2', 'group3']

и, возможно, обратно.

Необходима функция, которая может принимать список строк, разделенных запятыми (первый случай), или список строк с одинаковыми значениями (второй случай) и обрабатывать их как одно и то же: список строк.

В псевдокоде:

x = ['group1, group2, group3']
y = ['group1', 'group2', 'group3']

f(x) <==> f(y)    <- equivalent behavior

Кроме того, при использовании split() согласно предложениям:

Есть ли способ сделать пространство-разделитель нечувствительным или условным, или регулярным выражением: Я бы хотел получить результат ['group1', 'group2', 'group3'] или ['group1, group2, group3'], или ['group1,group2,group3'], или даже этот ['group1, group2,group3'] (или их комбинацию) в качестве входных данных?

Чуть больше пояснений:

>>> single_string = False
>>> a = ['group1', 'group2', 'group3','group4']
>>> [t.strip() for t in [a][0].split(',')] if single_string else a
['group1', 'group2', 'group3', 'group4']
>>> single_string = True
>>> b = ['group1,group2, group3,  group4']
>>> [t.strip() for t in [b][0].split(',')] if single_string else b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'split'
>>>

По сути, я ищу самое элегантное условное выражение Python, которое выдает одинаковый вывод как в случае a и b выше: ['group1', 'group2', 'group3', 'group4'].

Ответы [ 7 ]

0 голосов
/ 11 октября 2018

Вы были почти там в вашем редактировании:

def f(lst):
    return [t.strip() for t in lst[0].split(',')] if len(lst) == 1 else lst

>>> a = ['group1', 'group2', 'group3','group4']
>>> b = ['group1,group2, group3,  group4']

>>> f(a)
['group1', 'group2', 'group3', 'group4']
>>> f(b)
['group1', 'group2', 'group3', 'group4']
0 голосов
/ 11 октября 2018

Я думаю, что это наиболее ясно, просто используя split и strip.

# various scenarios to test
TESTS = [
    ['group1, group2, group3'],
    ['group1', 'group2', 'group3'],
    ['group1,group2,  group3'],
    ['group1', 'group2, group3'],
    ['group1 ,group2', 'group3'],
]


def normalize(args, delimiter=','):
    results = []
    for arg in args:
        results.extend(x.strip() for x in arg.split(delimiter))
    return results


for args in TESTS:
    assert normalize(args) == ['group1', 'group2', 'group3']


# test alternative delimiter
assert normalize(['group1 | group2 | group3'], delimiter='|') == ['group1', 'group2', 'group3']
0 голосов
/ 11 октября 2018

Используя str.replace() для устранения всех пробелов, вы можете использовать формулу, которая будет работать во всех представленных случаях.

lst = ['group1, group2, group3']

res = lst[0].replace(' ', '').split(',')
# ['group1', 'group2', 'group3']
0 голосов
/ 11 октября 2018

split () и join () могут попробовать.

case1 = ['group1, group2, group3']
output = [ele.split(",") for ele in case1]

Выход для case-1

[['group1', ' group2', ' group3']]

Case-2

case2 = [['group1', ' group2', ' group3']]
output = [", ".join(ele) for ele in case2]

Выход дляcase-2

['group1, group2, group3']
0 голосов
/ 11 октября 2018

Вы можете определить функцию, используя str.split на , с последующим выравниванием результата, используя itertools.chain

>>> from itertools import chain
>>> f = lambda x: list(chain(*[a.split(', ') for a in x]))

>>> f(['group1', 'group2', 'group3'])
>>> ['group1', 'group2', 'group3']

>>> f(['group1, group2, group3'])
>>> ['group1', 'group2', 'group3']

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

>>> import re
>>> f = lambda x, sep: list(chain(*[re.split('{}\s*'.format(sep), a) for a in x]))
>>> f(['group1, group2,group3'],',')
>>> ['group1', 'group2', 'group3']
0 голосов
/ 11 октября 2018

вы можете использовать split и join, чтобы перейти от одного представления к другому:

print('group1, group2, group3'.split(', '))
# ['group1', 'group2', 'group3']
print(', '.join(['group1', 'group2', 'group3']))
# group1, group2, group3

в функции, которую вы можете сделать это:

def f(items, index, separator=', '):
    if isinstance(items, str):
        items = items.split(separator)
    return items[index]


print(f('group1, group2, group3', 1))        # group2
print(f(['group1', 'group2', 'group3'], 1))  # group2
0 голосов
/ 11 октября 2018

Как насчет использования split():

Код:

['group1, group2, group3'][0].split(', ')

Код теста:

x = ['group1, group2, group3']    
print(x[0].split(', '))

Результаты:

['group1', 'group2', 'group3']

Для возврата:

Для возврата используйте str.join()

y = x[0].split(', ')
print(y)

xx = [', '.join(y)]
print(xx)

Результаты:

['group1', 'group2', 'group3']
['group1, group2, group3']
...