如何将字符串列表映射到整数列表

lol*_*ola 19 python

我有一个包含 n 个元素的列表:

['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
Run Code Online (Sandbox Code Playgroud)

我必须为每个字符串分配一个数字,开头为零,然后如果元素不同则加一,如果元素重复则给相同的数字。例子:

['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
[ 0,    1,      1,      2,        0,     3,     4,     4,     5,       3    ]
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

sup*_*ain 14

使用辅助字典:

>>> [*map({k: v for v, k in enumerate(dict.fromkeys(final))}.get, final)]
[0, 1, 1, 2, 0, 3, 4, 4, 5, 3]
Run Code Online (Sandbox Code Playgroud)

其它的办法:

>>> d = {}
>>> [d.setdefault(x, len(d)) for x in final]
[0, 1, 1, 2, 0, 3, 4, 4, 5, 3]
Run Code Online (Sandbox Code Playgroud)

  • 如果某人对编程足够陌生,不知道如何执行问题中提出的问题,我非常怀疑他们是否能够理解这些复杂的俏皮话。 (18认同)

小智 11

使用字典可以实现这一点。

def counts(a):
    dis = {}
    count=0
    for i in range(len(a)):
        if a[i] not in dis.keys():
            dis[a[i]] = count
            count+=1
        
    return([dis[x] for x in a])
Run Code Online (Sandbox Code Playgroud)

  • 我相信“for i, _ in enumerate(a)”比“for i in range(len(a))”更具Python风格。但是你只在“a[i]”中使用“i”,在这种情况下,只使用“for x in a”并使用“x”而不是“a[i]”更有意义。 (7认同)

JL *_*ret 6

使用defaultdict并使用计数器作为默认值函数。

每当键存在时,它返回存储的“第一次遇到的位置”,否则它会调用 Incr.__call__它增加其计数以提供新的第一次遇到的位置。

在超级大脑的建议下,使用现有的计数器类:

from collections import defaultdict 
from itertools import count

li = ['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
seen = defaultdict(count().__next__)
print( [seen[val] for val in li] )

Run Code Online (Sandbox Code Playgroud)

像以前一样滚动我自己的 Incr,这确实为您提供了可以返回任何内容(例如 GUID)的优势:

from collections import defaultdict 

class Incr:
    def __init__(self):
        self.count = -1

    def __call__(self):
        self.count +=1 
        return self.count

li = ['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']

seen = defaultdict(Incr())

print( [seen[val] for val in li] )

Run Code Online (Sandbox Code Playgroud)

两者都提供相同的输出:

[0, 1, 1, 2, 0, 3, 4, 4, 5, 3]
Run Code Online (Sandbox Code Playgroud)

  • 还可以使用 `itertools.count().__next__` 或 `seen.__len__` 或 `lambda: len(seen)` 作为默认工厂。 (2认同)

小智 3

尝试这个:

a = ['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
dct = {}
counter = 0
for i in range(len(a)):
    if a[i] not in dct.keys():
        dct[a[i]] = counter 
        counter += 1
print([(i, dct[i]) for i in a])
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

679 次

最近记录:

4 年,12 月 前