【问题标题】:Making a dictionary? from 2 lists / columns制作字典?来自 2 个列表/列
【发布时间】:2017-05-19 09:55:36
【问题描述】:

我有一个包含几列的大型数据库,我需要其中 2 列的数据。

最终结果是有 2 个下拉菜单,其中第一个设置“名称”,第二个是已合并到名称中的“数字”值。我只需要可用的数据,以便将其输入到另一个程序中。

因此是一个列表或字典,其中包含“名称”列表的唯一值,并附有数字列表中的数字。

# Just a list of random names and numbers for testing
names = [
    "Cindi Brookins",
    "Cumberband Hamberdund",
    "Roger Ramsden",
    "Cumberband Hamberdund",
    "Lorean Dibble",
    "Lorean Dibble",
    "Coleen Snider",
    "Rey Bains",
    "Maxine Rader",
    "Cindi Brookins",
    "Catharine Vena",
    "Lanny Mckennon",
    "Berta Urban",
    "Rey Bains",
    "Roger Ramsden",
    "Lanny Mckennon",
    "Catharine Vena",
    "Berta Urban",
    "Maxine Rader",
    "Coleen Snider"
]

numbers = [
    6,
    5,
    7,
    10,
    3,
    9,
    1,
    1,
    2,
    7,
    4,
    2,
    8,
    3,
    8,
    10,
    4,
    9,
    6,
    5
]

因此,在上面的示例中,“Berta Urban”会出现一次,但仍然分配了数字 8 和 9,“Rey Bains”将出现 1 和 3。

我试过了

mergedlist = dict(zip(names, numbers))

但这只会将最后一个数字分配给名称。

我不确定我是否可以制作一个包含多个“数字”的唯一“名称”的字典。

【问题讨论】:

    标签: python-2.7


    【解决方案1】:

    您只能获得与每个名称关联的最后一个数字,因为字典键是唯一的(否则它们不会有太大用处)。所以如果你这样做

    mergedlist["Berta Urban"] = 8 
    

    然后

    mergedlist["Berta Urban"] = 9
    

    结果将是

    {'Berta Urban': 9}
    

    就像你做的那样:

    berta_urban = 8
    berta_urban = 9
    

    在这种情况下,您会期望 berta_urban 的值是 9 而不是 [8,9]

    因此,如您所见,您需要一个 append 而不是分配给您的 dict 条目。

    from collections import defaultdict
    mergedlist = defaultdict(list)
    for (name,number) in zip(names, numbers): mergedlist[name].append(number)
    

    这给出了:

     {'Coleen Snider': [1, 5], 
      'Cindi Brookins': [6, 7],
      'Cumberband Hamberdund': [5, 10],
      'Roger Ramsden': [7, 8],
      'Lorean Dibble': [3, 9],
      'Rey Bains': [1, 3],
      'Maxine Rader': [2, 6],
      'Catharine Vena': [4, 4],
      'Lanny Mckennon': [2, 10],
      'Berta Urban': [8, 9]
    }
    

    这就是我认为你想要的。请注意,您将获得重复项,如 'Catharine Vena': [4, 4] 所示,您还将获得每个名称的数字列表,即使该列表中只有一个数字。

    【讨论】:

    • 谢谢,这也有效。现在有事情要做。
    【解决方案2】:

    你不能在一个字典中有多个同名的键,但是你的字典键可以是唯一的,同时保存一个匹配的数字列表。比如:

    mergedlist = {}
    for i, v in enumerate(names):
        mergedlist[v] = mergedlist.get(v, []) + [numbers[i]]
    
    print(mergedlist["Berta Urban"])  # prints [8, 9]
    

    虽然效率不高。根据您使用的数据库,数据库可能会比您对数据进行后处理和重建更快地以您喜欢的形式为您提供结果。

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多