Python 如何在列表字典中查找重复出现的字符串组(顺序无关紧要)?
字典列表中重复的字符串数量是固定的:字符串项--Python 如何在列表字典中查找重复出现的字符串组(顺序无关紧要)?,python,list,dictionary,Python,List,Dictionary,字典列表中重复的字符串数量是固定的:字符串项--Ruth、James、Sandy、Daniel、Sarah、Tommy、Alex、Rob、Teddy、Steve、Mark。此处n=11 我的字典如下所示(键后的数字是组的排名): 任务1:我想找到什么: 我想找出字符串项列表的组合频率(顺序不重要)。假设我选择了Teddy,Daniel,Alex的组合(顺序不重要),那么我想看看rank=1时该组的频率。然后我想看看当Teddy,Daniel,Alex处于秩=1时,秩=2的字符串是什么。例如,Ro
Ruth、James、Sandy、Daniel、Sarah、Tommy、Alex、Rob、Teddy、Steve、Mark
。此处n=11
我的字典如下所示(键后的数字是组的排名):
任务1:我想找到什么:
我想找出字符串项列表的组合频率(顺序不重要)。假设我选择了Teddy,Daniel,Alex的组合(顺序不重要),那么我想看看rank=1时该组的频率。然后我想看看当Teddy,Daniel,Alex
处于秩=1时,秩=2的字符串是什么。例如,Rob
在这三个名字排名1时排名2<代码>泰迪、亚历克斯、丹尼尔组在排名1中出现3次<代码>Rob出现两次。所以结果应该是,
Teddy,Daniel,Alex,3,Rob,2
这意味着Teddy、Daniel、Alex
在rank=1中出现三次;而Rob
在rank=2中出现两次,当这三个名字在rank=1中时
我的尝试:
我创建了一个包含字典中所有列表的列表<代码>总计者=[OneGroupRank1,OneGroupRank2,OneGroupRank3,TwoGroupRank1,TwoGroupRank2,TwoGroupRank1,TwoGroupRank2]
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)
这基本上从第0个列表中获取三个字符串并查找模式。这产生了{(String1,String2,String3):9}
-->9是出现的次数
我的问题是:
(1) 当需要检查每个组的条件(检查键值,然后继续)时,如何检查字典中的模式
(2) 如何将所有名称(n=11)组合为一组3,并检查模式?我不想依赖列表,我只想创建三个名称的组合。例如,泰迪,丹尼尔,亚历克斯另一个是泰迪,罗伯,史蒂夫等
(3) 如何完成上述任务1?假设(我认为是)一种更合理的输入格式:
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: {1: "count at rank 1", 2: "Counter for rank 2"}}
如果可能,您还可以将此问题扩展到更高级别。此问题并不能很清楚地解释您要完成的任务;我怀疑有人。这些词典是从哪里来的?总体目标是什么?
DictionaryList
(为什么没有7
)中键的意义是什么(如果有的话)?我可以回答问题2(),如果顺序不重要,请看。@jornsharpe,我很抱歉。我在任务1中陈述了我的总体目标。是的,我读到了,但是你能解释一下更大的图景吗?你为什么认为你需要完成任务1?@jornsharpe我正在执行关联规则挖掘。我只是想看看某个组是否在排名1中,哪些字符串最有可能跟随。例如,我将通过itertools.combines选择一个组(例如a、B、C),然后我将检查a、B、C在排名1时的总次数为10次,然后C、D在排名2时为8次。清楚吗?请让我知道,我可以进一步解释。不完全清楚(至少对我来说)。排名意味着什么?你如何知道哪个秩2s对应于哪个秩1s(如果它只是连续的键,考虑一个更好的结构,例如<代码> {DataSet:{Real:Set(成员)} < /代码>)。Mark
和3
也应该是一个输出吗?您是否需要特定的输出格式(当前的格式没有意义)?还有,你所说的“检查条件”到底是什么意思?也许你可以把这个问题简化成范围更窄的问题?回答得很好。正是我要找的。但是如何使名称=冻结集(['Teddy','Daniel','Alex']),名称组合是自动的?然后把它分配给字典?这一点你可以自己做-再看看,它会生成3个元组的名字。只是一个简单的问题。我可以用1,2,3替换A,B,C吗。当我使用1、2、3运行它时,它会显示if names.issubset(dataset[1]):@GravityM中的键错误,这不会有什么区别;我的代码中没有使用外键。
{names: {1: "count at rank 1", 2: "Counter for rank 2"}}