列出递增的字典系统(应该很简单)
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)
有人能帮忙吗?
意识到字典中不能有重复的键。
结合使用 set
和 enumerate
以及听写理解。
{v:i for i,v in enumerate(set(l))}
示例结果:
{'Honda': 0, 'Chevy': 1, 'Ford': 2}
并且请不要使用 dict
或 list
作为变量名,因为您正在隐藏 dict
和 list
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]}
如果此列表未排序,您可以先对其排序。
我正在尝试创建一个将列表转换为字典的系统。键应该是列表中的项目,而每个 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)
有人能帮忙吗?
意识到字典中不能有重复的键。
结合使用 set
和 enumerate
以及听写理解。
{v:i for i,v in enumerate(set(l))}
示例结果:
{'Honda': 0, 'Chevy': 1, 'Ford': 2}
并且请不要使用 dict
或 list
作为变量名,因为您正在隐藏 dict
和 list
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]}
如果此列表未排序,您可以先对其排序。