如何在列表字典中找到重复的字符串组(顺序无关紧要)?

时间:2014-07-28 16:23:28

标签: python list dictionary

在字典列表中重复有固定数量的字符串:字符串项 - Ruth, James, Sandy, Daniel, Sarah, Tommy, Alex, Rob, Teddy, Steve, Mark。这里n = 11

我的字典如下所示(键后面的数字是组的排名):

DictionaryLists = {
                   1: {1 : ['Teddy', 'Daniel', 'Alex']},
                   2: {2 : ['Rob', 'Steve', 'Mark', 'Sandy']},
                   3: {5 : ['Ruth', 'Sarah', 'James']},
                   4: {1 : ['Teddy', 'Alex', 'Steve', 'Sandy', 'Daniel']},
                   5: {2 : ['Mark', 'Sarah', 'Rob']},
                   6: {1 : ['Teddy', 'Daniel', 'Alex']},
                   7: {2 : ['Mark', 'Sandy']}
                  }

任务1:我想找到的内容: 我想找出字符串项列表组合的频率(顺序无关紧要)。假设我选择Teddy, Daniel, Alex的组合(顺序无关紧要),那么我想在rank = 1时看到该组的频率。然后我想看看rank = 2 WHEN中的字符串是什么Teddy, Daniel, Alex在rank = 1中。例如,当{3}名在等级1中时,Rob在等级2中。Teddy, Alex, Daniel组在等级1中出现3次。{{1}出现两次。所以结果应该是,

Rob

这意味着Teddy,Daniel,Alex,3,Rob,2 在rank = 1中出现三次:Teddy,Daniel,Alex在rank = 2时出现2次,当这三个名称在rank = 1时。

我的尝试: 我创建了一个包含字典中所有列表的列表。 Rob

TotalLists = [OneGroupRank1, OneGroupRank2, OneGroupRank3, TwoGroupRank1, TwoGroupRank2, ThreeGroupRank1, ThreeGroupRank2]

这基本上从第0个列表中取出三个字符串并找到模式。这产生了n=3 NewDict = {} TotalListStrings = tuple(TotalLists[0][0:n]) #3 strings are taken from the list 0 NewDict = {TotalListStrings : 1} for IndividualLists in lists[1:]: if all(item in IndividualList for item in TotalListStrings): NewDict[TotalListStrings]+=1 print(NewDict) - >的结果。 9是发生的次数。

我的问题是:

(1)当有条件要检查(检查关键值,然后继续)每个组时,如何检查字典中的模式?

(2)如何创建所有名称(n = 11)的组合作为一组3并检查模式?我只想创建三个名称的组合,而不是依赖于列表。例如,泰迪,丹尼尔,亚历克斯另一个将是泰迪,罗布,史蒂夫等。

(3)如何完成上述任务1

1 个答案:

答案 0 :(得分:2)

假设(我认为)更合理的输入格式:

data = {'A': {1: ['Teddy', 'Daniel', 'Alex'],
              2: ['Rob', 'Steve', 'Mark', 'Sandy'],
              3: ['Ruth', 'Sarah', 'James']},
        'B': {1: ['Teddy', 'Alex', 'Steve', 'Sandy', 'Daniel'],
              2: ['Mark', 'Sarah', 'Rob']},
        'C': {1: ['Teddy', 'Daniel', 'Alex'], 
              2: ['Mark', 'Sandy']}}

你可以这样做:

from collections import Counter

output = {1: 0, 2: Counter()}

names = frozenset(['Teddy', 'Daniel', 'Alex'])

for dataset in data.values():
    if names.issubset(dataset[1]):
        output[1] += 1
        output[2].update(dataset[2])

哪个会给出输出:

>>> output
{1: 3, 
 2: Counter({'Mark': 3, 
             'Rob': 2, 
             'Sandy': 2, 
             'Sarah': 1, 
             'Steve': 1})}

通过将names设为frozenset,它也可以用作字典键,因此您可以浏览所有combinations并获取最终输出:

{names: {1: "count at rank 1", 2: "Counter for rank 2"}}

您也可以将此扩展到更高级别(如果可用)。