列出递增的字典系统(应该很简单)

list to incrementing dict system (should be simple)

我正在尝试创建一个将列表转换为字典的系统。键应该是列表中的项目,而每个 unique 键的值应该是递增的数字(1、2、3、4 等)。

期望的结果:

Input:
list = ["Ford", "Ford", "Chevy", "Chevy", "Chevy", "Honda", "Honda", "Honda", "Honda"]

Output:
dict = {
  "Ford": 1,
  "Ford": 1,
  "Chevy": 2,
  "Chevy": 2,
  "Chevy": 2,
  "Honda": 3,
  "Honda": 3,
  "Honda": 3,
  "Honda": 3,
}

我尝试使用它,因为它允许我从 0 开始并递增。它最终没有成功。

dict = {}
list = []
for x, index in list:
  if x not in list:
      dict[x] = len(dict)

这是我得到的错误:

ValueError: too many values to unpack (expected 2)

有人能帮忙吗?

意识到字典中不能有重复的键。

结合使用 setenumerate 以及听写理解。

{v:i for i,v in enumerate(set(l))}

示例结果:

{'Honda': 0, 'Chevy': 1, 'Ford': 2}

并且请不要使用 dictlist 作为变量名,因为您正在隐藏 dictlist built-in 函数。

你可以使用变量而不是 len(dict) 并检查字典是否已经有键或相应地添加键值对

dict={}
list=["Ford", "Ford", "Chevy", "Chevy", "Chevy", "Honda", "Honda", "Honda", "Honda"]
count=1
for i in list:
    if i in dict:
        continue
    dict[i]=count
    count+=1
print(dict)

您得到的 ValueError 是因为 for x, index in list: 无效。列表的迭代器只会 return 单个对象,即列表中的值。如果要同时获取元素的索引和元素的索引,则需要enumerate。但是,这不一定是获取用于汽车名称的索引的最佳方式。此外,根据 DeepSpace 和 Netwave 的建议,我使用的变量名称也不是 Python 关键字。

cars_list = ["Ford", "Ford", "Chevy", "Chevy", "Chevy", "Honda", "Honda", "Honda", "Honda"]
cars_dict = {}
for car_name in cars_list:
    cars_dict.setdefault(car_name, len(cars_dict))

setdefault 将设置 cars_dict[car_name] 的值,如果 car_name 尚未作为键存在,但如果 car_name 已经存在,则不会更改该值当前的。 len(cars_dict) 将是钥匙的数量,因此当您添加新车时,它将是一个以前未使用过的值。

这仍然不会生成具有重复键的字典,但是:

print(cars_dict)
# yields {'Ford': 0, 'Chevy': 1, 'Honda': 2}

如果你有一个排序列表(就像你在例子中所做的那样),你可以使用 itertools groupby()count() 来很好地做到这一点。 count() 创建一个递增迭代器,它会增加您每次使用它的时间。当您将其与组一起压缩时,您可以为列表中的每个组分配一个递增的数字。

from itertools import groupby, count

l = ["Ford", "Ford", "Chevy", "Chevy", "Chevy", "Honda", "Honda", "Honda", "Honda"]

d = {}
for cnt, (k, v) in zip(count(1), groupby(l)):
    d[k] = [cnt] * len(list(v))

d 将是:

{'Ford': [1, 1], 'Chevy': [2, 2, 2], 'Honda': [3, 3, 3, 3]}

如果此列表未排序,您可以先对其排序。