【问题标题】:splitting comma separated list [duplicate]拆分逗号分隔列表[重复]
【发布时间】:2012-11-07 05:08:41
【问题描述】:

可能重复:
Split a list into nested lists on a value

我有一个这样的列表:

['jj01','gg01',',','yy01','hh01',',','yy04','uu01']

我如何将这个列表拆分成它的元素——像这样在',' 上拆分:

[['jj01','gg01'],['yy01','hh01'],['yy04','uu01']]

提前致谢。

【问题讨论】:

  • 我的眼睛在流血!!!

标签: python


【解决方案1】:

一种可能的“pythonic”方式:

l = ['jj01','gg01',',','yy01','hh01',',','yy04','uu01']
joined = ':'.join(l)
separated = joined.split(':,:')
final = [x.split(':') for x in separated]

可以组合成单行:

final = [x.split(':') for x in ':'.join(l).split(':,:')]

正如 cmets 中所指出的,此解决方案仅在列表的内容是字符串时才有效。

【讨论】:

  • 这行得通,但前提是对象是字符串。这绝对不是一个通用的解决方案。
  • @mgilson 非常正确,感谢您的澄清。
【解决方案2】:

人为什么这么复杂?

def process(lst):
    lines = []
    temp = []
    for item in lst:
        if item != ',':
            temp.append(item)
        else:
            lines.append(temp)
            temp = []
    return lines

【讨论】:

  • 我的回答太虚伪了
【解决方案3】:
a = ['jj01','gg01',',','yy01','hh01',',','yy04','uu01']
b = []
d = []

for c in a:
   if c == ',':
     b.append(d)
     d = []
   else:
     d.append(c)

b.append(d)
#no b contains your split data

这不是一个“聪明”的解决方案,但我认为它充其量是可读的。

【讨论】:

  • 我认为pass 真的不需要,是吗?
  • 啊,是的,代码进化的残余。 (删除它)
【解决方案4】:

这里有一个比我之前想出的更聪明的解决方案:

import itertools
def iter_partition(itr,sep):
    iitr = iter(itr)
    res = list(itertools.takewhile(lambda x: x!=sep,iitr))
    while res:
        yield res
        res = list(itertools.takewhile(lambda x: x!=sep, iitr))

L = ['jj01','gg01',',','yy01','hh01',',','yy04','uu01']
print list(iter_partition(L,','))

但是如果你可以有连续的分隔符,这会失败:['foo',',',',','bar']——你永远不会看到bar


还有另一个 itertools 解决方案(这个比上一个更强大):

import itertools
def iter_partition(itr,sep):
    for k,v in itertools.groupby(itr,key=lambda x:x==sep):
        if not k:
            yield (list(v))

【讨论】:

    【解决方案5】:

    以下是一个更面向功能的解决方案,尽管不可读的单行解决方案。我建议采用此处发布的更具可读性的方法之一。

    # where 'ls' is your list
    foo = zip(*[iter(filter(lambda x: x != ',', ls))]*2)
    

    编辑** 正如@mgilson 正确指出的那样,我的解决方案假定您将始终有两个连续的项目,后跟一个逗号。如果您的列表以一个奇怪的项目结束,它将被丢弃。

    【讨论】:

    • 如果我没看错的话,这个解决方案假定您总是有两个连续的项目,后跟一个分隔符 (','),如示例中所示。我认为这只是一个例子,我认为 OP 也想处理['foo',',','bar','baz','qux',',','foobar','barbaz'] 的情况。
    【解决方案6】:

    static void Main(string[] args) { List str = new List() { "jj01", "gg01", ",", "yy01", "hh01", ",", "yy04", "uu01" }; 列表 newval = new List(); StringBuilder res = new StringBuilder(); for (int i = 0; i

            }
            foreach (var item in newval)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
    

    【讨论】:

    • 提问者正在寻找 Python 而非 Java 的解决方案。
    猜你喜欢
    • 2011-07-26
    • 2013-10-05
    • 1970-01-01
    • 2023-04-09
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多