我有一个看起来像这样的字符串列表
name=['Jack','Sam','Terry','Sam','Henry',.......]
我想创建一个具有如下所示逻辑的新列表。我想转到名称中的每个条目,并在第一次看到该条目时为其分配一个编号。如果它被重复(如“Sam”的情况),我想为其分配相应的编号,将其包含在我的新列表中并继续。
newlist = []
name[1] = 'Jack'
Jack = 1
newlist = ['Jack']
name[2] = 'Sam'
Sam = 2
newlist = ['Jack','Sam']
name[3] = 'Terry'
Terry = 3
newlist = ['Jack','Sam','Terry']
name[4] = 'Sam'
Sam = 2
newlist = ['Jack','Sam','Terry','Sam']
name[5] = 'Henry'
Henry = 5
newlist = ['Jack','Sam','Terry','Sam','Henry']
我知道这可以通过类似的事情来完成
u,index = np.unique(name,return_inverse=True)
但对我来说,循环遍历列表名称的各个条目并保留上面的逻辑很重要。有人可以帮我解决这个问题吗?
最佳答案
尝试使用dict
并检查键是否已与值配对:
name = ['Jack','Sam','Terry','Sam','Henry']
vals = {}
i = 0
for entry in name:
if entry not in vals:
vals[entry] = i + 1
i += 1
print vals
结果:
{'Henry': 5, 'Jack': 1, 'Sam': 2, 'Terry': 3}
元素可以通过“索引”(读:键)访问,就像访问列表一样,除了“索引”是 key
的任何内容。是;在本例中,键是名称。
>>> vals['Henry']
5
编辑:如果顺序很重要,您可以将项目输入 dict
使用号码作为键:这样,您就可以根据号码知道哪个所有者是哪个:
name = ['Jack','Sam','Terry','Sam','Henry']
vals = {}
i = 0
for entry in name:
#Check if entry is a repeat
if entry not in name[0:i]:
vals[i + 1] = entry
i += 1
print (vals)
print (vals[5])
此代码使用它们出现的顺序作为键。为了确保我们不会覆盖或创建重复项,它会检查当前名称是否曾出现在列表中(从 0 到 i
的任何位置,即 name
列表中的当前索引)。
这样,它仍然是你想要的“排序顺序”。您无需通过所有者的姓名来访问项目,只需按其编号进行索引即可。这将为您提供示例中您想要的顺序。
结果:
>>> vals
{1: 'Jack', 2: 'Sam', 3: 'Terry', 5: 'Henry'}
>>> vals[5]
'Henry'
关于python - 循环遍历列表中的条目并创建新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31389144/