1

重複の可能性:
リストを値のネストされたリストに分割する

私はこのようなリストを持っています:

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

このリストをその要素に分割するにはどうすればよいですか?次のように分割します','

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

前もって感謝します。

4

6 に答える 6

2

これを行うための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(':,:')]

コメントで指摘されているように、このソリューションは、リストの内容が文字列である場合にのみ機能します。

于 2012-11-07T05:30:21.913 に答える
1

これは私が以前に思いついたよりも少し賢い解決策です:

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))
于 2012-11-07T05:15:22.120 に答える
1
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

これは「賢い」解決策ではありませんが、せいぜい読みやすいと思います。

于 2012-11-07T05:18:37.313 に答える
1

なぜそんなに複雑な人々?

def process(lst):
    lines = []
    temp = []
    for item in lst:
        if item != ',':
            temp.append(item)
        else:
            lines.append(temp)
            temp = []
    return lines
于 2012-11-07T05:19:22.910 に答える
0

以下は、読みにくいワンライナーソリューションですが、より機能指向です。ここに掲載されている、より読みやすいアプローチの1つを採用することをお勧めします。

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

編集**@mgilsonが正しく指摘しているように、私のソリューションでは、常に2つの連続した項目の後にコンマが続くと想定しています。あなたのリストが奇妙なアイテムで終わった場合、それは破棄されます。

于 2012-11-07T05:43:17.423 に答える
-1

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 <str.Count; i ++){if(str [i] == "、"){res.Remove(res.Length-3、3); newval.Add(res.ToString()); res = new StringBuilder(); } else res.Append((str [i] + "、")); //最後のアイテムif(i == str.Count --1){res.Remove(res.Length-3、3); newval.Add(res。ToString()); }

        }
        foreach (var item in newval)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
于 2012-11-07T05:45:03.350 に答える