如何处理一个字符串列表,其中每个字符串可能是由逗号分隔的字符串列表?

4

我想将这个列表转换

list = ['orange','cherry,strawberry','cucumber,tomato,coconut,avocado','apple','blueberry,banana']

to

new_list = ['orange','cherry','strawberry','cucumber','tomato','coconut','avocado','apple','blueberry','banana']

这是否有可能做到?请帮我!


[y for x in thelist for y in x.split(',')] - Steven Rumbalski
@StevenRumbalski 兄弟,它成功了!!!非常感谢你。 - Jakhongir Alikhanov
你的问题是列表扁平化的变体:https://dev59.com/qnNA5IYBdhLWcg3wdtld - Demi-Lune
5个回答

5

加入和分离!

>>> lst = ['orange','cherry,strawberry','cucumber,tomato,coconut,avocado','apple','blueberry,banana']
>>> ','.join(lst).split(',')
['orange', 'cherry', 'strawberry', 'cucumber', 'tomato', 'coconut', 'avocado', 'apple', 'blueberry', 'banana']

1
比我的列表推导方法更简洁,赞。 - paxdiablo

4

如果规则是列表中的每个条目可以是代表一个单独项(没有逗号)或由逗号分隔的项列表,则只需在每个条目上使用str.split(',') 即可。

请注意术语,这很重要:

  • 列表是您拥有的内容,并且其中包含许多字符串条目;
  • 每个字符串条目是一个项或由逗号分隔的项目列表;
  • 每个是您希望作为新列表中单独条目的内容。

对于没有逗号的条目,str.split将为您提供只包含该项的列表:

>>> 'cherry'.split(',')
['cherry']

针对包含逗号的条目,它将会返回一个包含该条目所有项的列表:

>>> 'cherry,banana'.split(',')
['cherry', 'banana']

所以你只需要处理列表,对于列表中的每个条目,把它拆分成一个项目列表,并使用这些项目构造一个新列表:

[item for entry in my_list for item in entry.split(',')]
 |  | \                  / \                          /
 |  |  \ get each entry /   \ get each item of entry /
 |  |   \______________/     \______________________/
 |  |
 +--+------> deliver all items into new list

您可以在以下记录中看到它的工作方式:
>>> my_list = ['orange', 'cherry,strawberry', 'apple', 'blueberry,banana']
>>> [item for entry in my_list for item in entry.split(',')]
['orange', 'cherry', 'strawberry', 'apple', 'blueberry', 'banana']

请记住,如果您想处理带有空格的条目(例如'cherry, pie'),您应该删除多余的空格。
[item.strip() for entry in ...

2

您可以以","为分隔符进行拆分,然后使用itertools.chain.from_iterable函数将子列表展开:

>>> from itertools import chain
>>> lst = ['orange','cherry,strawberry','cucumber,tomato,coconut,avocado','apple','blueberry,banana']
>>> list(chain.from_iterable(x.split(",") for x in lst))
['orange', 'cherry', 'strawberry', 'cucumber', 'tomato', 'coconut', 'avocado', 'apple', 'blueberry', 'banana']

2

Extend 指将累加器列表 (newvals) 扩展,同时按照字符串逗号 (",") 进行分割。

values = ['orange','cherry,strawberry','cucumber,tomato,coconut,avocado','apple','blueberry,banana']

newvals = []
for v in values: newvals.extend(v.split(','))
print(newvals) 

输出:

['orange', 'cherry', 'strawberry', 'cucumber', 'tomato', 'coconut', 'avocado', 'apple', 'blueberry', 'banana']

0

我们还可以将列表展平,如下所示:

list_1 = ['orange','cherry,strawberry','cucumber,tomato,coconut,avocado','apple','blueberry,banana', 2, 2.5]





def to_flatten(my_list, primitives=(bool, str, int, float)):
    
    flatten = []
    my_list = [stuff.split(',') if type(stuff) == str else stuff for stuff in list_1]
    
    for item in my_list:
        if isinstance(item, primitives):
            flatten.append(item)
        else:
            flatten.extend(item)
    return flatten
   
print(to_flatten(list_1))

这提供了

['orange', 'cherry', 'strawberry', 'cucumber', 'tomato', 'coconut', 'avocado', 'apple', 'blueberry', 'banana', 2, 2.5]

[Program finished]

您可以根据需要更改原始数据类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接