Alex
Alex

Reputation: 81

How to number elements in a list of string and return a new list?

So I have a list of strings. I want to create a new list of string which turns the same string into a new string and name it "A". If there's a different string in the list, name it "B" and so on. If the string is:

['F4','A3','F4','B5','A3','K2']

Then it should give me a result of:

['A','B','A','C','B','D']

I don't know how to start the code and can only think of something like a dictionary.

dict = {}
result = []
for line in list1:
    if line not in dict:
       dict.update({line:str(chr(65+len(dict)))})
result.append(dict.get(line))

Then I don't know how to continue. Any help will be appreciated.

Upvotes: 3

Views: 68

Answers (3)

Mark
Mark

Reputation: 92440

You can make an iterator of ascii upper-case strings and pull them off one-at-a-time in a defaultdict constructor. One you have that, it's just a list comprehension. Something like:

import string
from collections import defaultdict

keys = iter(string.ascii_uppercase)
d = defaultdict(lambda: next(keys))

l = ['F4','A3','F4','B5','A3','K2']

[d[k] for k in l]
# ['A', 'B', 'A', 'C', 'B', 'D']

Upvotes: 3

Ajax1234
Ajax1234

Reputation: 71451

You can create a simple class to store the running results:

import string
class L:
   def __init__(self):
      self.l = {}
   def __getitem__(self, _v):
      if (val:=self.l.get(_v)) is not None:
        return val
      self.l[_v]= (k:=string.ascii_uppercase[len(self.l)])
      return k


l = L()
vals = ['F4','A3','F4','B5','A3','K2']
result = [l[i] for i in vals]

Output:

['A', 'B', 'A', 'C', 'B', 'D']

Upvotes: -1

Eric Truett
Eric Truett

Reputation: 3010

import string

mapping = {}
offset = 0

for item in l:
    if item in mapping:
        continue
    mapping[item] = string.ascii_uppercase[offset]
    offset += 1

[mapping.get(item) for item in l]

Output

['A', 'B', 'A', 'C', 'B', 'D']

Upvotes: 0

Related Questions