从Python列表中并排连接单词

时间:2018-10-19 16:57:09

标签: python string python-3.x list dataframe

有一堆从 .txt 文件转换而来的列表,这些列表已被读取为类似于以下字符串的集合:

['New', 'Jersey', '1', '0', '1', '999']
['West', 'North', 'Central', '1', '0', '100', '90']

这些列表的并排单词数不同(第一个有2个,第二个有3个,依此类推。)

我想输出一个新列表(然后到一个已编译的数据框中),该列表将单词并排连接在一起,例如:

['New Jersey', '1', '0', '1', '999']
['West North Central', '1', '0', '100', '90']

这将使新列表(和数据框)具有相同的长度。

只需append(line.split())进入每个字符串的新列表很容易,但是却无法弄清楚连接所有单词并分别附加每个数字所需的if语句和.join()。

7 个答案:

答案 0 :(得分:6)

使用itertools.groupby,您可以按str.isalpha分组,有条件地连接字符串,然后将结果链接起来:

from itertools import chain, groupby

L = ['New', 'Jersey', '1', '0', '1', '999']

grouper = groupby(L, key=str.isalpha)
joins = [[' '.join(v)] if alpha_flag else list(v) for alpha_flag, v in grouper]
res = list(chain.from_iterable(joins))

print(res)

['New Jersey', '1', '0', '1', '999']

答案 1 :(得分:2)

我基本上是遍历list1中的字符串。如果碰巧是一个单词,我将其附加到list2,否则将其附加到list3。如果字符串仅由数字组成,则isdigit()方法将返回true。最后,使用“ join”将list2的所有内容追加为单个字符串进行回答,并使用extend将list3的所有元素添加到answer []的末尾。

void tree::searching(node *root,int key)
{
    if(root->key==key||root==NULL)
    {
       cout<<"Congratulation Element found in the BST"<<"\n";
       return;
    } else {
        if(key<root->key)
        {
           searching(root->left,key);
        } else {
           searching(root->right,key);
        }
    }
}

答案 2 :(得分:0)

EarlyStopping

答案 3 :(得分:0)

您可以编写自己的函数来进行串联,例如:

l = [
    ['New', 'Jersey', '1', '0', '1', '999'],
    ['West', 'North', 'Central', '1', '0', '100', '90']]

def my_concat(l):
    nl = []
    cur = None
    delim = ""
    for i in l:
        if isinstance(i, (str, unicode)) and i.isalpha():
            if cur == None:
                cur = ""
            cur += delim + i
            delim = " "
        else:
            if cur != None:
                nl.append(cur)
                cur = None
                delim = ""
            nl.append(i)
    return nl

for i in l:
    print my_concat(i)

输出:

['New Jersey', '1', '0', '1', '999']
['West North Central', '1', '0', '100', '90']

答案 4 :(得分:0)

您可以使用itertools.groupby

from itertools import groupby
l = [
    ['New', 'Jersey', '1', '0', '1', '999'],
    ['West', 'North', 'Central', '1', '0', '100', '90']
]
print([list.__add__(*(list(g) if k else [' '.join(g)] for k, g in groupby(s, key=str.isdigit))) for s in l])

这将输出:

[['New Jersey', '1', '0', '1', '999'], ['West North Central', '1', '0', '100', '90']]

答案 5 :(得分:0)

我建议执行以下步骤:

1)查找单词主词的索引 2)如果您有两个或多个非数字的连续索引,请附加它们

案例:

import re

numeric_regex = re.compile('[0-9]+?') #Regex to find numeric indices 
test = ['New', 'Jersey', '1', '0', '1', '999', 'West', 'North', 'Central', '1', '0']

#Comprehension to find word indices 
word_indices = [idx for idx, x in enumerate(test) if numeric_regex.match(x) is None]

#Comprehension to find indices to merge on
merge_on = [idx for idx, x in enumerate(word_indices) if word_indices[idx-1] == x-1]

在这一点上,我迷上了一种无需for循环的方法,因此我将仅使用for循环:

reversed_merge_on = reversed(merge_on)
for x in reversed_merge_on:
    test[word_indices[x]-1] = ' '.join(test[word_indices[x]-1:word_indices[x]+1])
    del test[word_indices[x]]

这将使您浏览任何给定列表。您可以将其放入函数中并将其应用于许多列表。上面的代码将按原样工作,因此您可以将其复制到Python(我使用的是2.7)以自己查看。

答案 6 :(得分:0)

使用列表推导并将非数字项合并到一个索引中,然后为数字解压缩列表推导。

lst = ['West', 'North', 'Central', '1', '0', '100', '90']
res = [' '.join([i for i in lst if not i.isdigit()]),*[i for i in lst if i.isdigit()]]
print(res)
# ['West North Central', '1', '0', '100', '90']