将一个列表的列表转换为一个元组列表的列表

9

我有一个列表,其中包含:

> [['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')]]

我从文本文件中读取数据,以下是我的代码:
```python ```
我没有看到您的代码,请提供更多上下文信息。
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附加到一个新列表中,但它不起作用。有什么想法吗?
5个回答

8

可以使用tuplesplit函数和列表推导式:

[[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')]]

太酷了,谢谢!从没想过我们可以这样使用列表推导式。 - Irfan HP

3
你只有一个大元组列表的原因是你使用了两个 'for loop' 遍历嵌套列表,但每次只添加一次。根据你的代码进行更正。你可以创建一个空的临时列表,在其上添加内容,然后将临时列表附加到结果中。这样,你的结果将是一个包含元组的列表列表。尝试这样做:
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')]]

我之前尝试过使用临时列表,但将temp初始化到外部循环,可能因为这个原因它仍然附加到一个大列表中。 - Irfan HP
@Irfan HP,你是对的,并记得将每个temp(小列表)附加到大列表中,以使其成为列表内的列表。这就是standard_form_tokens.append(temp)所做的。 - Marcus.Aurelianus

2
使用列表推导式。
例子:
```python ```
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')]]

2
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))

1
kata, tag, ner = anotasi[0], anotasi[1], anotasi[2] == kata, tag, ner = anotasi - Patrick Artner

2

使用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')]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接