在元组列表中使用元组元素匹配列表元素

时间:2017-11-02 16:18:52

标签: python list tuples

我有一个包含字符串的列表:

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)

但这显然不起作用,我没有找到解决方案。 任何提示将不胜感激。

6 个答案:

答案 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元素的直接引用,而不是其索引。我没有使用ilst中提取元素,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