将列表列表转换为元组列表列表
Posted
技术标签:
【中文标题】将列表列表转换为元组列表列表【英文标题】:convert a list of list into a list of list of tuple 【发布时间】:2018-12-19 00:38:43 【问题描述】:我有一个列表包括:
> [['Di/in/QUE', 'mana/wh/QUE', 'lokasi/nn/INTENT', 'laboratorium/nnp/LOC', 'dasar/nnp/LOC', '?/?/O'], ['Di/in/QUE', 'mana/wh/QUE', 'lokasi/nn/INTENT', 'laboratorium/nnp/LOC', 'dasar/nnp/LOC', '2/nnp/LOC', '?/?/O'], ['Di/in/QUE', 'mana/wh/QUE', 'lokasi/nn/INTENT', 'laboratorium/nnp/LOC', 'lanjut/nnp/LOC', '?/?/O']]
我想把它转换成一个元组列表,像这样:
> [[('Di','in','QUE'), ('mana','wh','QUE'), ('lokasi','nn','INTENT'), ('laboratorium','nnp','LOC'), ('dasar','nnp','LOC'), ('?','?','O')], [('Di','in','QUE'), ('mana','wh','QUE'), ('lokasi','nn','INTENT'), ('laboratorium','nnp','LOC'), ('dasar','nnp','LOC'), ('2','nnp','LOC'), ('?','?','O')], [('Di','in','QUE'), ('mana','wh','QUE'), ('lokasi','nn','INTENT'), ('laboratorium','nnp','LOC'), ('lanjut','nnp','LOC'), ('?','?','O')]]
我从文本文件中读取数据,所以这是我的代码:
with open("corpusposner.txt", "r") as f:
vallist = [line.split() for line in f]
f.close()
standard_form_tokens = []
for sentence in vallist:
for satupsg in sentence:
anotasi = satupsg.split('/')
kata, tag, ner = anotasi[0], anotasi[1], anotasi[2]
standard_form_tokens.append((kata, tag.lower(), ner))
当我打印 standard_form_tokens 时,它只返回一个大的元组列表
[('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium' , 'nnp', 'LOC'), ('dasar', 'nnp', 'LOC'), ('?', '?', 'O'), ('Di', 'in', 'QUE' ), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('dasar', ' nnp', 'LOC'), ('2', 'nnp', 'LOC'), ('?', '?', 'O'), ('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('lanjut', 'nnp' , 'LOC'), ('?', '?', 'O')]
我尝试将standard_form_tokens 附加到一个新列表中,但它不起作用。有什么想法吗?
【问题讨论】:
【参考方案1】:将 tuple
与 split
和列表理解一起使用:
[[tuple(i.split('/')) for i in j] for j in arr]
输出:
[[('Di', 'in', 'QUE'),
('mana', 'wh', 'QUE'),
('lokasi', 'nn', 'INTENT'),
('laboratorium', 'nnp', 'LOC'),
('dasar', 'nnp', 'LOC'),
('?', '?', 'O')],
[('Di', 'in', 'QUE'),
('mana', 'wh', 'QUE'),
('lokasi', 'nn', 'INTENT'),
('laboratorium', 'nnp', 'LOC'),
('dasar', 'nnp', 'LOC'),
('2', 'nnp', 'LOC'),
('?', '?', 'O')],
[('Di', 'in', 'QUE'),
('mana', 'wh', 'QUE'),
('lokasi', 'nn', 'INTENT'),
('laboratorium', 'nnp', 'LOC'),
('lanjut', 'nnp', 'LOC'),
('?', '?', 'O')]]
【讨论】:
很酷,谢谢!从来没有想过我们可以像这样使用列表推导。【参考方案2】:你只有一个大的元组列表的原因是你使用两个'for循环'来循环列表列表,但你只在每个实例上追加一次。
根据您的代码正确。您可以创建一个空的临时列表,在其上附加,然后将临时附加到您的结果中。然后,您的结果将是一个包含元组的列表列表。
试试这个:
standard_form_tokens = []
for sentence in vallist:
temp=[]
for satupsg in sentence:
anotasi = satupsg.split('/')
kata, tag, ner = anotasi
temp.append((kata, tag.lower(), ner))
standard_form_tokens.append(temp)
输出:
[[('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'),
('laboratorium', 'nnp', 'LOC'), ('dasar', 'nnp', 'LOC'), ('?', '?', 'O')],
[('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'),
('laboratorium', 'nnp', 'LOC'), ('dasar', 'nnp', 'LOC'), ('2', 'nnp',
'LOC'), ('?', '?', 'O')], [('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'),
('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('lanjut',
'nnp', 'LOC'), ('?', '?', 'O')]]
【讨论】:
我在使用临时列表之前尝试过,但先在 for 循环之外初始化 temp,可能是因为它仍然附加到一个大列表中。 @Irfan HP,你是对的,记住将每个临时(小列表)附加到大列表中,使其在列表中列出。这就是 standard_form_tokens.append(temp) 的作用。【参考方案3】:使用列表推导。
例如:
d = [['Di/in/QUE', 'mana/wh/QUE', 'lokasi/nn/INTENT', 'laboratorium/nnp/LOC', 'dasar/nnp/LOC', '?/?/O'], ['Di/in/QUE', 'mana/wh/QUE', 'lokasi/nn/INTENT', 'laboratorium/nnp/LOC', 'dasar/nnp/LOC', '2/nnp/LOC', '?/?/O'], ['Di/in/QUE', 'mana/wh/QUE', 'lokasi/nn/INTENT', 'laboratorium/nnp/LOC', 'lanjut/nnp/LOC', '?/?/O']]
print( [[tuple(j.split("/")) for j in i] for i in d] )
输出:
[[('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('dasar', 'nnp', 'LOC'), ('?', '?', 'O')], [('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('dasar', 'nnp', 'LOC'), ('2', 'nnp', 'LOC'), ('?', '?', 'O')], [('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('lanjut', 'nnp', 'LOC'), ('?', '?', 'O')]]
【讨论】:
【参考方案4】:standard_form_tokens = []
for sentence in vallist:
standard_form_tokens.append([])
for satupsg in sentence:
anotasi = satupsg.split('/')
kata, tag, ner = anotasi[0], anotasi[1], anotasi[2]
standard_form_tokens[-1].append((kata, tag.lower(), ner))
【讨论】:
kata, tag, ner = anotasi[0], anotasi[1], anotasi[2]
== kata, tag, ner = anotasi
【参考方案5】:
使用map
:
1.
map
+列表理解:
print(list(map(lambda x: [tuple(i.split('/')) for i in x],l)))
2.
map
+map
:
print(list(map(lambda x: list(map(lambda y: tuple(y.split('/')),x)),l)))
两者都输出:
[[('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('dasar', 'nnp', 'LOC'), ('?', '?', 'O')], [('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('dasar', 'nnp', 'LOC'), ('2', 'nnp', 'LOC'), ('?', '?', 'O')], [('Di', 'in', 'QUE'), ('mana', 'wh', 'QUE'), ('lokasi', 'nn', 'INTENT'), ('laboratorium', 'nnp', 'LOC'), ('lanjut', 'nnp', 'LOC'), ('?', '?', 'O')]]
【讨论】:
以上是关于将列表列表转换为元组列表列表的主要内容,如果未能解决你的问题,请参考以下文章