如何在理解中为集合添加值?

时间:2013-07-26 00:46:38

标签: python list-comprehension dictionary-comprehension set-comprehension

假设我有一个字符串列表列表(stringList):

[['its', 'all', 'ball', 'bearings', 'these', 'days'], 
['its', 'all', 'in', 'a', 'days', 'work']]

我还有一组字符串(stringSet)是stringList:

中的唯一字
{'its', 'all', 'ball', 'bearings', 'these', 'days', 'in', 'a', 'work'}

使用理解,如果可能的话,我如何获得一个字典,将stringSet中的每个单词映射到包含该单词的stringList索引的字典?在上面的示例中,返回值为:

{'its': {0,1}, 'all':{0,1}, 'ball':{0}, 'bearings':{0}, 'these':{0}, 'days':{0,1}, 'in':{1}, 'a':{1}, 'work':{1}}

我的挂断是如何将索引累积到字典中。我相信对于那些比我更进一步的人来说相对简单。提前谢谢......

4 个答案:

答案 0 :(得分:3)

>>> alist = [['its', 'all', 'ball', 'bearings', 'these', 'days'], 
... ['its', 'all', 'in', 'a', 'days', 'work']]
>>> aset = {'its', 'all', 'ball', 'bearings', 'these', 'days', 'in', 'a', 'work'}

>>> {x: {alist.index(y) for y in alist if x in y} for x in aset}
{'a': set([1]), 'all': set([0, 1]), 'ball': set([0]), 'these': set([0]), 'bearings': set([0]), 'work': set([1]), 'days': set([0, 1]), 'in': set([1]), 'its': set([0, 1])}

此外,您可以使用enumerate并使用list作为值将使结果更清晰:

>>> {x: [i for i, y in enumerate(alist) if x in y] for x in aset}
{'a': [1], 'all': [0, 1], 'ball': [0], 'these': [0], 'bearings': [0], 'work': [1], 'days': [0, 1], 'in': [1], 'its': [0, 1]}

答案 1 :(得分:3)

这似乎有效:

str_list = [
    ['its', 'all', 'ball', 'bearings', 'these', 'days'], 
    ['its', 'all', 'in', 'a', 'days', 'work']
]
str_set = set(word for sublist in str_list for word in sublist)

str_dict = {word: set(lindex
        for lindex, sublist in enumerate(str_list) if word in sublist)
    for word in str_set}

print (str_dict)

答案 2 :(得分:1)

这是我的代码,与一些嵌套循环一起使用,试图制作一些你会发现易于阅读和理解的东西!

def accumulate(stringList,stringSet):
    outputDict = {}
    for setItem in stringSet:
        outputItem = set()
        for i,listItem in enumerate(stringList):
            if setItem in listItem:
                outputItem.add(i)
        outputDict[setItem] = outputItem
    return outputDict

stringList = [['its', 'all', 'ball', 'bearings', 'these', 'days'], ['its', 'all', 'in', 'a', 'days', 'work']]
stringSet = {'its', 'all', 'ball', 'bearings', 'these', 'days', 'in', 'a', 'work'}

print(accumulate(stringList,stringSet))

答案 3 :(得分:0)

您可以使用嵌套循环:

result = {}
for w in stringSet:
    result[w] = []
    for i,l in enumerate(stringList):
        if w in l:
            result[w].append(i)

它的作用是它遍历stringSet中的每个单词,并检查它是否在第一个列表中,在第二个列表中等,并相应地更新字典。