我有一个包含 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)
小智 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)
使用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)
小智 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 次 |
| 最近记录: |