我有一个包含字符串的列表:
lst = ['a', 'a', 'b']
其中每个字符串实际上是一个语料库的类别,我需要一个与该类别的索引相对应的整数列表。
为此,我构建了一个元组列表,其中我有每个(唯一)类别及其索引,f.ex:
catlist = [(0, 'a'), (1, 'b')]
我现在需要迭代第一个字符串列表,如果元素匹配元组的任何第二个元素,则将元组的第一个元素返回到数组,如下所示:
[0, 0, 1]
现在我有
catindexes = []
for item in lst:
for i in catlist:
if cat == catlist[i][i]:
catindexes.append(i)
但这显然不起作用,我没有找到解决方案。 任何提示将不胜感激。
答案 0 :(得分:1)
>>> lst = ['a', 'a', 'b']
>>> catlist = [(0, 'a'), (1, 'b')]
>>> catindexes = []
>>> for item in lst:
... for i in catlist:
... if i[1] == item:
... catindexes.append(i[0])
...
>>> catindexes
[0, 0, 1]
在迭代期间,i
是对catlist
元素的直接引用,而不是其索引。我没有使用i
从lst
中提取元素,for ... in ...
已经处理了这个问题。由于i
是对元组的直接引用,因此我可以简单地提取相关字段以进行匹配和追加,而无需弄乱lst
的索引。
答案 1 :(得分:1)
你很接近,在迭代内循环后,你应该检查外环中的项是否实际上等于tup[1]
(每个tup代表(0, 'a')
或(1, 'b')
例如)。
如果它们相等,只需将tup中的第一个元素(tup[0]
)附加到结果列表中。
lst = ['a', 'a', 'b']
catlist = [(0, 'a'), (1, 'b')]
catindexes = []
for item in lst:
for tup in catlist:
if item == tup[1]:
catindexes.append(tup[0])
print (catindexes)
你也可以使用列表理解:
catindexes = [tup[0] for item in lst for tup in catlist if tup[1] == item]
答案 2 :(得分:0)
您可以从d
创建一个字典(我们称之为catlist
)并将其反转。现在,对于i
的每个元素lst
,您要找的是d[i]
:
d = {v: k for k, v in catlist}
res = [d[i] for i in lst]
<强>输出:强>
>>> lst = ['a', 'a', 'b']
>>> d = {v: k for k, v in catlist}
>>> d
{'a': 0, 'b': 1}
>>>
>>> res = [d[i] for i in lst]
>>> res
[0, 0, 1]
答案 3 :(得分:0)
大列表的有效方式:
第1步:构建好字典。
d=dict((v,k) for (k,v) in catlist)
第2步:使用它。
[d[k] for k in lst]
这样,执行时间将增加len(lst) + len(catlist)
而不是len(lst) x len(catlist)
# Create a word document to contain R outputs
doc = docx(template = "your_landscape_doc.docx" )
doc = map_title(doc, stylenames = c("Heading1"))
init_Conn <- file('my_file.txt', 'r+')
Lines <- readLines(init_Conn)
close(init_Conn)
my_title='just a title'
doc <- addTitle(doc, my_title, level=1)
doc <- addParagraph(doc, Lines, stylename = "Normal")
doc <- addPageBreak( doc )
# Write the Word document to a file
writeDoc(doc, file = "r-reporters-simple-word-document.docx")
。
答案 4 :(得分:0)
我建议您为lst = ['a', 'a', 'b']
catdict = {'a': 0, 'b': 1}
res = [catdict[k] for k in lst] # res = [0, 0, 1]
使用dictionary。我认为它更适合你想做的事情:
var crypto = require('crypto'); //include crypto
var evaluation_tag = crypto.createHash('sha256').update(JSON.stringify(result)).digest('hex'); //generate etag on api response
var client_etag = (!req.header('clientsETag')) ? "" : req.header('clientsETag'); //the application I am working with could not send the etag in any other manner
var status_code = (evaluation_tag!==client_etag) ? status : 304; // if the response data is different from the one in the application cache, send status different that 304
var response_data = (evaluation_tag!==client_etag) ? result : []; // if response has not changed, don't resend it to spare bandwidth and run time in both sides (client and server)
res.setHeader('etag', evaluation_tag);//send etag of new response
res.send(clear_response); //send response
答案 5 :(得分:0)
条件定义if block是否正确。
试试这个..
lst = ['a', 'a', 'b']
catlist = [(0, 'a'), (1, 'b')]
catindexes = []
for item in lst:
for i in catlist:
if i[1]==item:
catindexes.append(i[0]);
print catindexes