在某些条件下组合列表元素

2024-09-28 23:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

如果满足某个条件,如何组合列表的元素。在

我看到过一些关于组合列表元素的帖子,但不包括某些条件。在

假设我有一个包含单词列表的列表:

words = [
    ['this','that!','riff','raff'],
    ['hip','hop!','flip!','flop'],
    ['humpty','dumpty!','professor!','grumpy!']
]

如何仅组合那些包含!的元素?在

例如,输出如下所示:

^{pr2}$

我试过了:

for word in words:
    word = ', '.join(i for i in word if re.search('!',str(i)))
    print word

但是得到了:

that!
hop!, flip!
dumpty!, professor!, grumpy!

谢谢。在


Tags: in元素列表forthat条件单词帖子
3条回答

我的解决方案是:

words = [
    ['this','that!','riff','raff'],
    ['hip','hop!','flip!','flop'],
    ['humpty','dumpty!','professor!','grumpy!']
]

output = []
for wl in words:
    out_wl = []
    bang_wl = []
    for w in wl:
        if '!' in w:
            bang_wl.append(w)
        else:
            if bang_wl:
                out_wl.append(','.join(bang_wl))
                bang_wl = []
            out_wl.append(w)
    if bang_wl:
        out_wl.append(','.join(bang_wl))
    output.append(out_wl)

print output

输出:

^{pr2}$

bang_wl!累加单词,直到它碰到不包含!的单词。此时,它joinbang_wl中的单词,并将其附加到output_wl列表中。

result = []

for sub_lst in words:
    result.append([])
    temp = ""
    for ele in sub_lst:
        if not temp and not "!" in ele:
            result[-1].append(ele)
        elif temp and not "!" in ele:
            result[-1].append(temp)
            result[-1].append(ele)
            temp = ""
        else:
            temp += "," + ele if temp else ele
    if temp:
        result[-1].append(temp)
 [['this', 'that!', 'riff', 'raff'], ['humpty', 'dumpty!,professor!,grumpy!'], ['hip', 'hop!,flip!', 'flop']]

如果您希望所有带!的单词都连接起来,包括由不包含!的单词分隔的单词,即['humpty', 'dumpty!', 'professor!', 'grumpy!',"foo","bar!"]将变成 ['humpty', 'foo', 'dumpty!,professor!,grumpy!,bar!']

^{pr2}$

一些计时显示@vikramls效率最高,itertools解决方案效率最低

In [31]: %%timeit
   ....: result = []
   ....: for sub_lst in words:
   ....:     result.append([])
   ....:     temp = ""
   ....:     for ele in sub_lst:
   ....:         if not temp and not "!" in ele:
   ....:             result[-1].append(ele)
   ....:         elif temp and not "!" in ele:
   ....:             result[-1].append(temp)
   ....:             result[-1].append(ele)
   ....:             temp = ""
   ....:         else:
   ....:             temp += "," + ele if temp else ele
   ....:     if temp:
   ....:         result[-1].append(temp)
   ....: 
100000 loops, best of 3: 16 µs per loop

In [32]: %%timeit
output = []
for wl in words:
    out_wl = []
    bang_wl = []
    for w in wl:
        if '!' in w:                   
            bang_wl.append(w)
        else:                        
            if bang_wl:
                out_wl.append(','.join(bang_wl))
                bang_wl = []
            out_wl.append(w)
    if bang_wl:                               
        out_wl.append(','.join(bang_wl))
    output.append(out_wl)
   ....: 
100000 loops, best of 3: 15.2 µs per loop

In [33]: %%timeit
out = []
>>> for lst in words:
    d = []
    for k, g in groupby(lst, lambda x: '!' in x):
        if k:
            d.append(', '.join(g))
        else:                     
            d.extend(g)
    out.append(d)
   ....: 
10000 loops, best of 3: 48.1 µs per loop

如果您只希望单词以!结尾:

In [34]: %%timeit
result = []
for sub_lst in words:
    result.append([])
    temp = ""                              
    for ele in sub_lst:
        if not temp and not ele[-1] == "!":
            result[-1].append(ele)
        elif temp and not ele[-1] == "!":
            result[-1].append(temp)
            result[-1].append(ele)
            temp = ""
        else:               
            temp += "," + ele if temp else ele
    if temp:                            
        result[-1].append(temp)
   ....: 
100000 loops, best of 3: 17 µs per loop

使用^{}

>>> from itertools import groupby
>>> out = []
>>> for lst in words:
    d = []
    for k, g in groupby(lst, lambda x: '!' in x):
        if k:
            d.append(', '.join(g))
        else:
            d.extend(g)
    out.append(d)
...     
>>> out
[['this', 'that!', 'riff', 'raff'],
 ['hip', 'hop!, flip!', 'flop'],
 ['humpty', 'dumpty!, professor!, grumpy!']]

相关问题 更多 >