Python сопоставляет список строк с целочисленным списком - PullRequest
5 голосов
/ 09 февраля 2012

Допустим, у меня есть список

l = ['michael','michael','alice','carter']

Я хочу сопоставить его со следующим:

k = [1,1,2,3]

Где Майкл соответствует 1, Алиса соответствует 2 и т. Д. Есть лифункция в Python, чтобы сделать это легко?

Ответы [ 9 ]

10 голосов
/ 09 февраля 2012

Посмотрите на ord, который дает номер Unicode для данного символа:

>>> letters = ['a','b','c','d','e','f','g']
>>> [ord(x) for x in letters]
[97, 98, 99, 100, 101, 102, 103]

Таким образом, вы можете сделать ord(x)-96, чтобы преобразовать a-z в 1-26 (осторожно в верхнем регистре и т. Д.).

l = ['a','b','a','c']
k = [ord(x)-96 for x in l] # [1,2,1,3]

Опять же, осторожно в верхнем регистре и не алфавитных символах.

5 голосов
/ 30 января 2017

Чтобы ответить на отредактированный вопрос, т. Е. Чтобы отобразить список строк с уникальными целыми числами, необходимо сначала найти уникальные строки, а затем выполнить 1-1 сопоставление строк с целыми числами в исходном списке строк.Например,

s = ['michael','michael','alice','carter']

, тогда уникальные строки {'michael','alice','carter'}.Теперь преобразуйте эти строки в целые числа с помощью отображения 1-1, например {'michael','alice','carter'} =[1,2,3], используя словарь {'michael':1,'alice':2,'carter':3}.На третьем шаге пройдитесь по исходному списку строк;найдите строку в словаре для соответствующего целого числа и замените строку этим целым числом.

s=['michael','michael','alice','carter']

mydict={}
i = 0
for item in s:
    if(i>0 and item in mydict):
        continue
    else:    
       i = i+1
       mydict[item] = i

k=[]
for item in s:
    k.append(mydict[item])

Вывод:

k=[1, 1, 2, 3]
3 голосов
/ 03 апреля 2017

Как насчет использования панд? import pandas as pd l = ['michael','michael','alice','carter'] pd.Series(l).astype('category').cat.codes.values

3 голосов
/ 10 июля 2015

Чтобы отобразить список целых чисел в список строк, я бы использовал словарь, например:

> name_number = {'michael':1, 'michael':1, 'alice':2, 'carter':3}
> print len(name_number)
  3
> print name_number['alice']
  2

Обратите внимание, что len(name_number) равно 3, поскольку дубликаты ключей не допускаются.

2 голосов
/ 09 февраля 2012

Если я правильно читаю вас, вы хотите взять список символов и преобразовать их в целые числа с существом 1, b, равным 2 и т. Д.там, так что не имеет значения, заглавные или строчные.

1 голос
/ 09 февраля 2012

Функция: zip

Например:

>>> l = ['a','b','a','c']
>>> k = [1,2,1,3]¨
>>> zip(l,k)
[('a', 1), ('b', 2), ('a', 1), ('c', 3)]

Если вы хотите использовать элементы l в качестве индекса, вам нужен словарь:

>>> d = dict(zip(l,k))
>>> d
{'a': 1, 'c': 3, 'b': 2}
>>> d['a']
1
>>> d['c']
3
>>> 
0 голосов
/ 24 мая 2019

Если вам не важен порядок назначенных идентификаторов, это работает:

# create unique list of  names
unique_l = set(l)

# create mappings from names to id
name2id = {name: idx+1 for idx, name in enumerate(unique_l)}

# map initial list of names to ids
k = [name2id[name] for name in l]

Выход:

[2, 2, 1, 3]
0 голосов
/ 09 февраля 2012

Из вашего вопроса не ясно, хотите ли вы сгенерировать k на основе l, или указаны оба значения l и k.

Если вы хотите создать k на основе l, ответ @ математический.coffee должен подойти.

Если вы хотите карту из элементов от l до k, очевидно, что ваши элементы в l должны быть уникальными.

Посмотрите, искали ли вы это

dict((l[index], k[index]) for index in range(len(l)))

Или, если вы ищете кортежи:

[(l[index], k[index]) for index in range(len(l))]
0 голосов
/ 09 февраля 2012

может сделать это довольно легко без функции:

j - list()    
for i in range (len(l)) : 
   j.append((l[i],k[i]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...