有一堆从 .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()。
答案 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']