将列表列表转换为元组列表

时间:2018-07-11 04:59:34

标签: python python-3.x list nested nested-lists

我有一个包含以下内容的列表:

> [['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附加到新列表中,但是它不起作用。有什么想法吗?

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

之所以只有一个大的元组列表,是因为您使用了两个“ 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')]]

答案 2 :(得分:2)

使用列表理解。

例如:

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

答案 3 :(得分:2)

com.android.support:appcompat

答案 4 :(得分: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')]]