Python 如何使用项目内的标签对列表中的项目进行分组?
有如下列表:Python 如何使用项目内的标签对列表中的项目进行分组?,python,list,ner,Python,List,Ner,有如下列表: list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')] 我需要根据列表a[x][0]标签加入列表a[x][1]项目:“以字母B开头”并全部加入下一个“B-开头”标签(列表a[x][0]): 类似于在Oracle中使用
list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')]
我需要根据列表a[x][0]
标签加入列表a[x][1]
项目:“以字母B开头”并全部加入下一个“B-开头”标签(列表a[x][0]
):
类似于在Oracle中使用stringagg+groupby:)这是一种使用
str.startswith
的简单迭代的方法
Ex:
list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')]
res = []
for k, v in list_a:
if k.startswith("B"): #Check starts with `B`
res.append(v)
else:
res[-1]+= v
print(res)
['07/08/20', 'Abcdefghjklm']
输出:
list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')]
res = []
for k, v in list_a:
if k.startswith("B"): #Check starts with `B`
res.append(v)
else:
res[-1]+= v
print(res)
['07/08/20', 'Abcdefghjklm']
这是一种使用
str.startswith
的简单迭代的方法
Ex:
list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')]
res = []
for k, v in list_a:
if k.startswith("B"): #Check starts with `B`
res.append(v)
else:
res[-1]+= v
print(res)
['07/08/20', 'Abcdefghjklm']
输出:
list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')]
res = []
for k, v in list_a:
if k.startswith("B"): #Check starts with `B`
res.append(v)
else:
res[-1]+= v
print(res)
['07/08/20', 'Abcdefghjklm']
您可以在下面尝试:
output = []
for obj in list_a:
if obj[0].startswith('B'):
output.append(obj[1])
else:
output[-1] += obj[1]
print(output)
您可以在下面尝试:
output = []
for obj in list_a:
if obj[0].startswith('B'):
output.append(obj[1])
else:
output[-1] += obj[1]
print(output)
这是我的变体,但我希望有更“现代”的方式在python上实现:
list_b = []
for i in range(len(list_a)):
if list_a[i][0][0] == 'B':
list_b += [list_a[i][1]]
else:
list_b[len(list_b)-1] += list_a[i][1]
print(list_b)
这是我的变体,但我希望有更“现代”的方式在python上实现:
list_b = []
for i in range(len(list_a)):
if list_a[i][0][0] == 'B':
list_b += [list_a[i][1]]
else:
list_b[len(list_b)-1] += list_a[i][1]
print(list_b)
单线解
下面是一个使用列表理解的单行答案。诀窍是在每次新出现的'B'
的值前面使用一个明显可识别的分隔符(我使用了'| |'
)
str(''.join([f'| | | |{v}如果k.startswith(“B”)或v代表列表a中的(k,v)).split('| | |}')[1:]
输出:
['07/08/20', 'Abcdefghjklm']
算法
'B'
对应的值前面都有'| | |'
”| | |“
拆分字符串str.split()
保留除第一个元素以外的所有元素'B'
的值前面使用一个明显可识别的分隔符(我使用了'| |'
)
str(''.join([f'| | | |{v}如果k.startswith(“B”)或v代表列表a中的(k,v)).split('| | |}')[1:]
输出:
['07/08/20', 'Abcdefghjklm']
算法
'B'
对应的值前面都有'| | |'
”| | |“
拆分字符串str.split()
保留除第一个元素以外的所有元素我希望这件事可以不绕圈子。可能有一些lambda函数+itertools:(我认为循环是无法避免的,因为您有一个tuples@Rakesh您可以使用列表理解在一行中完成此操作。因为我修改了您的答案,发现您的答案是其他答案中最具Python风格的,所以我也投票支持您。我希望它可以在没有循环的情况下完成。可能有一些lambda函数+itertools:(我认为循环是无法避免的,因为您有一个tuples@Rakesh您可以使用列表理解在一行中完成此操作。因为我修改了您的答案,发现您的答案是其他答案中最具Python风格的,所以我也投票支持您。我希望它可以在没有循环的情况下完成。可能有一些lambda函数+itertools:(我希望它能在没有循环的情况下完成。也许是一些lambda函数+itertools:(@lullia这个怎么样?太棒了!!!!你真的是python大师!非常感谢!当我获得15个声誉时,你会得到我的声音:)@Lullia很高兴我能帮上忙!你能不能
接受
和投票
答案?谢谢你。@Lullia这个怎么样?太棒了!!!你真的是python大师!非常感谢!当我获得15个声誉时,你会听到我的声音:)@Lullia很高兴我能帮上忙!你能接受和投票吗?谢谢。