在Python函数中灵活分割输入字符串

时间:2018-10-11 04:50:26

标签: python function split

在Python中,转换此结构的最优雅的方法是:

Upload corpus documents and include ground truth (upload the original workspace's type system first)

进入此结构:

['group1, group2, group3']

并可能返回。

所需要的是一个函数,该函数可以采用逗号分隔值的字符串列表(第一种情况)或具有相同值的字符串列表(第二种情况)并将它们当作一个相同的对象处理:一个列表字符串。

使用伪代码:

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

此外,如果根据建议使用x = ['group1, group2, group3'] y = ['group1', 'group2', 'group3'] f(x) <==> f(y) <- equivalent behavior

有没有办法使分隔符空间不敏感,是否有条件或不使用正则表达式:我想获取split()['group1', 'group2', 'group3']甚至是{ {1}}(或其组合)作为输入?

更多说明:

['group1, group2, group3']

基本上,我正在寻找最优雅的Python条件表达式,在上面的['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' >>>

7 个答案:

答案 0 :(得分:3)

您可以使用splitjoin从一种表示形式转换为另一种表示形式:

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

答案 1 :(得分:1)

如何使用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']

答案 2 :(得分:1)

您可以在,上使用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']

答案 3 :(得分:1)

您的编辑几乎在那儿

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']

答案 4 :(得分:0)

split()和join()可以尝试。

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

案例1的输出

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

情况2

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

案例2的输出

['group1, group2, group3']

答案 5 :(得分:0)

通过使用str.replace()消除所有空白,您可以使用适用于所有出现的情况的公式。

lst = ['group1, group2, group3']

res = lst[0].replace(' ', '').split(',')
# ['group1', 'group2', 'group3']

答案 6 :(得分:0)

我认为使用splitstrip最为清楚。

# 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']