Python 字典:若列表中有字符串,则将列表的名称分配给字典

Python 字典:若列表中有字符串,则将列表的名称分配给字典,python,list,dictionary,assign,Python,List,Dictionary,Assign,设置 我有下面的组列表 lofl=[A,B,...,N] 其中每个组都包含子组 A=['A1','A2','A3',...,An] B=['B1','B2','B3',...,Bn] # ⋮ ⋮ N=['N1','N2','N3',...,Nn] 最后,我有一本字典数据。 意图 例如,我想检查子组An是否在lofl中,如果是,我想将其字符串名'A'分配给数据['group'],并将An分配给数据['subgroup'] 注意:在我的实际数据集中,A,B,…,N和An,B

设置

我有下面的组列表

lofl=[A,B,...,N]
其中每个组都包含子组

A=['A1','A2','A3',...,An]
B=['B1','B2','B3',...,Bn]
# ⋮           ⋮
N=['N1','N2','N3',...,Nn]
最后,我有一本字典
数据

意图

例如,我想检查子组
An
是否在
lofl
中,如果是,我想将其字符串名
'A'
分配给
数据['group']
,并将
An
分配给
数据['subgroup']

注意:在我的实际数据集中,
A,B,…,N
An,Bn,…,Nn
都是没有数字的名称。
当前代码

if x in lofl:
   if x in A:
      data['group']='A'
      data['subgroup']=x
   elif x in B:
      data['group']='B'
      data['subgroup']=x
   #     ⋮
   elif x in N:
      data['group']='N'
      data['subgroup']=x
   else:
      data['group']='unknown'
      data['subgroup']=x

问题


代码有点长。此外,我希望在不同的数据集上重用代码,因为组名不同。我希望避免为每个数据集替换代码中的名称。有什么建议吗?

避免长串的变量名,因为它们都指向同一类数据。改用字典:

subgroups = {
    'A': ['A1','A2','A3',...,An]
    'B': ['B1','B2','B3',...,Bn],
    # ⋮           ⋮
    'N': ['N1','N2','N3',...,Nn],
}
现在,您可以用循环替换单独的
if..elif..else
树:

if x in lofl:
    data['subgroup'] = x
    for name, subgroup in subgroups.items():
        if x in subgroup:
            data['group'] = name
            break
    else:
        data['group'] = 'unknown'

<>你可能想考虑创建索引;在所有这些列表上循环并测试每个列表是昂贵的(例如,测试中的每个
都必须循环整个列表)。考虑使用SET而不是列表(SET成员资格的测试需要O(1)恒定的时间而不是O(n)线性时间)和/或索引(例如,在代码< >子组< /COD>列表中的字典映射值)到它们所属的密钥,所以你所要做的就是使用<代码>索引。获得(x,‘未知’)< /C>而不是一个循环。< /p>为什么长的名字列表,每个都引用一个列表?将它们移动到字典中,这样您就可以在键值对上使用循环。@MartijnPieters如何在键值对上执行循环?我是python新手。谢谢你的提示。我要改用字典,试试这个!我称之为列表,但我应该称之为集合。所有组和子组都是唯一的。代码不起作用。也就是说,它将
'unknown'
分配给所有
数据['group']
。我对代码做了一些修改:现在它不再分配
“未知”
。但是,它没有分配正确的
子组
名称
A
,而是将
A1、A2、…An
分配给
数据['group']
。我想我需要将“data['group']=subgroup”行更改为类似于“data['group']=subgroup.name()”的内容。你知道做这件事的命令吗?我已经搜索了30分钟了。@LucSpan:这就是为什么我问你(关于这个问题)是否分配了组名。您的代码表明您正在分配整个列表。请回复这些评论并更新您的问题以更正错误。我的错,我只看到了您的答案。我觉得问题很清楚,我会更新的。@LucSpan:我刚刚更新了它,还有我的答案。这些名字是字典里的关键。我无法评估为什么子组中的
x
测试失败,因为您没有将样本输入与预期输出共享;否则,循环将准确反映示例决策树。