【问题标题】:Dictionary: assign name of list to dictionary if string in list字典:如果列表中有字符串,则将列表的名称分配给字典
【发布时间】:2017-08-24 01:18:56
【问题描述】:

设置

我有以下组列表,

lofl=[A,B,...,N]

其中每个组都包含子组,

A=['A1','A2','A3',...,An]
B=['B1','B2','B3',...,Bn]
# ⋮           ⋮
N=['N1','N2','N3',...,Nn]

最后,我有一本字典data。


意图

我想检查一下,例如子组An 在lofl 中,如果是这样,我想将其字符串名称'A' 分配给data['group'] 并将An 分配给data['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


问题

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

【问题讨论】:

  • 为什么会有一长串名字,每一个都引用一个列表?将它们移动到字典中,这样您就可以在键值对上使用循环。
  • @MartijnPieters 我将如何在键值对上进行循环?我是 python 新手。

标签: python list dictionary assign


【解决方案1】:

避免长长的变量名列表,它们都指向同一种数据。改用字典:

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'

您可能需要考虑创建索引;遍历所有这些列表并测试每个列表是昂贵的(例如,每个 in 测试必须遍历完整列表)。考虑使用集合而不是列表(测试集合成员资格需要 O(1) 恒定时间而不是 O(N) 线性时间)和/或索引(如字典将 subgroups 列表中的值映射到它们所属的键,所以你所要做的就是使用index.get(x, 'unknown') 而不是循环)。

【讨论】:

  • 感谢您的提示。我将切换到字典并尝试一下!我称它们为列表,但我应该称它们为集合。所有组和子组都是唯一的。
  • 代码不起作用。也就是说,它将'unknown' 分配给所有data['group']。我稍微更改了代码:现在它不再分配'unknown'。但是,而不是分配例如正确的subgroup 名称A,它将A1,A2,...An 分配给data['group']。我想我需要将'data ['group'] = subgroup'行更改为'data ['group'] = subgroup.name()'。您知道执行此操作的命令吗?我现在已经搜索了 30 分钟。
  • @LucSpan:这就是为什么我问你(关于这个问题)你是否正在分配组名。您的代码建议您分配整个列表。请务必回复此类 cmets 并更新您的问题以更正错误。
  • 我的错,我只看到你的答案。我认为问题很清楚,我会更新。
  • @LucSpan:我刚刚更新了它,以及我的答案。名称是字典中的键。我无法评估为什么 x in subgroup 测试对您失败,因为您没有与预期输出共享样本输入;否则循环准确地反映了您的示例决策树。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多