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

时间:2015-07-13 16:55:57

标签: 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)

但对我来说,循环列表名称的各个条目并保持上面的逻辑非常重要。有人可以帮我这个吗?

4 个答案:

答案 0 :(得分:2)

尝试使用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}

元素可以通过" index" (读取:键)就像你对列表所做的那样,除了"索引"是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到iname列表中的当前索引) 。

通过这种方式,它仍处于"排序顺序"你要哪个。您只需按照其编号索引,而不是按所有者的名称访问项目。这将根据您的示例为您提供所需的订单。

结果:

>>> vals
{1: 'Jack', 2: 'Sam', 3: 'Terry', 5: 'Henry'}
>>> vals[5]
'Henry'

答案 1 :(得分:0)

编辑:因为订单对您很重要。使用collections模块中的orderedDict()

使用字典。使用for循环遍历列表,然后检查字段中是否有if语句的名称。 enumerate为您提供了您的姓名的索引编号,但请记住索引编号从0开始,因此根据您的问题,我们将索引编号附加1,从而给出了我们开始编制索引的错觉1

import collections

nl = ['Jack','Sam','Terry','Sam','Henry']

d = collections.OrderedDict()

for i,n in enumerate(nl):
    if n not in d:
        d[n] = [i+1]

print d

输出:

OrderedDict([('Jack', [1]), ('Sam', [2]), ('Terry', [3]), ('Henry', [5])])

修改

有序的字典仍然是字典。因此,您可以使用.items()将键值对作为元组。这个数字必须是一个列表,所以你可以这样做:

for i in d.items():
    print '{} = {}'.format(i[0],i[1][0]) #where `i[1]` gives you the number at that position in the tuple, then the `[0]` gives you the first element of the list.

输出:

Jack = 1
Sam = 2
Terry = 3
Henry = 5

答案 2 :(得分:0)

如果你真的想创建变量。通过使用globals()我正在创建全局变量。如果你想要你可以使用locals创建局部变量()

使用globals()/ locals()创建一个字典,它是变量的查找表及其值,通过添加您创建变量的键和值

lists1 = ['Jack','Sam','Terry','Sam','Henry']

var = globals()

for i,n in enumerate(nl,1):
    if n not in var:
        var[n] = [i]

print var

{'Jack':1,'Sam': 2,'Terry': 3, 'Henry':5}

print Jack

1

答案 3 :(得分:0)

如果原始列表的顺序是关键,我可以建议两个数据结构,一个字典和一个新列表

d = {}
newlist = []
for i,n in enumerate(nl):
    if n not in d:
        d[n] = [i+1]
    newlist.append({n: d[n]})

新名单将返回

[{'Jack': [1]}, {'Sam': [2]}, {'Terry': [3]}, {'Sam': [2]}, {'Henry': [5]}]

走路:

for names in newlist:
    for k, v in names.iteritems():
        print('{} is number {}'.format(k, v))

注意:这并不容易根据上面建议的其他名称查找号码。这将需要更多的数据结构逻辑。但是,这会让您保留原始列表顺序,但要记录首次找到名称的时间。