python - 循环遍历列表中的条目并创建新列表

标签 python string list loops

我有一个看起来像这样的字符串列表

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/

相关文章:

python:如何覆盖str.join?

python - 将列表元素作为单独的字符串传递给 Django 方法

java - 查找字符串中第一个元音的索引

python - while 循环计数器比较两个列表

java - 如何在 Java 中创建可调整大小的抽象 arrayList

java - 链表和快速排序

java - 如何在 Java 中添加新的替代构造函数?

python - 球体表面测地线(最短距离路径)之间的交点

java - 在未知索引处的某些字符之间搜索子字符串

python - 替换键值表中的子字符串