2017-02-10 4 views
0

Не уверен, что мой заголовок достаточно ясен. У меня есть следующий список:Как избавиться от «K» из списка строк, который я хочу быть целым

[u'394', u'132.2k', u'6.8k', u'1', u'100', u'457', u'3.5k', u'3.5k', u'184', u'507', u'57'] 

Я хочу, чтобы перебрать этот список, все удалить K, а при удалении их умножить элемент на 1000. Таким образом, я думаю, мне нужно, чтобы преобразовать каждую строку как целое число, прежде чем умножая Это.

Я пробовал различные рецепты, но я как бы потерял. Вот то, что я сделал до сих пор:

for item in stringlist: 
    if 'k' in item: 
     finallist.append(item) 

однако это не работает, потому что вернуть мне список k без каких-либо цифр. Я также пытался использовать replace, но не смог заставить его работать.

Я знаю, что это очень легко to convert strings into integers, но это не мой главный вопрос здесь ...

ответ

6

Попробуйте это:

start_list = [u'394', u'132.2k', u'6.8k', u'1', u'100', u'457', u'3.5k', u'3.5k', u'184', u'507', u'57'] 

end_list = [int(1000*float(x.replace('k', ''))) if 'k' in x else int(x) for x in start_list] 

print(end_list) 

принты:

[394, 132200, 6800, 1, 100, 457, 3500, 3500, 184, 507, 57] 

EDIT: мы можем сделайте это немного более надежным, в случае пустых элементов, так как (разнесены на разборчивость):

start_list = [u'394', u'132.2k', u'6.8k', u'1', u'100', u'457', u'3.5k', u'3.5k', u'184', u'507', u'57', u'.', u'1.2'] 

end_list = [int(1000*float(x.replace('k', ''))) if 'k' in x 
      else int(float('0' + x + '0')) if '.' in x 
      else int(x) 
      for x in start_list] 

print(end_list) 

, добавив '0' в обе стороны какого-либо элемента с . (но не k) в нем, мы фиксируем пустой случай u'.'. Обратите внимание, что это будет округлять десятичные значения, с выходом следующим образом:

[394, 132200, 6800, 1, 100, 457, 3500, 3500, 184, 507, 57, 0, 1] 
+0

Я пытался на моем реальном списке элементов, и я эту ошибку , что это значит ? 'invalid literal для int() с базой 10: '.'' –

+2

Имеет ли ваш список элемент' u'. ''? – L3viathan

+0

Я настраиваю одну из двух вещей, она работает !!!! –

2

Вы можете использовать регулярные выражения, чтобы определить, есть ли у вас обычный номер, или «К» номер (как «3K» и «3.0 k "даст 3000).

Update: в качестве бонуса, это один также имеет дело с «М» для Mega и «G» для Giga :-)

import re 

ds = [u'394', u'132.2k', u'6.8k', u'7k', u'9.7G', u'18.1M'] 


factors = {'k': 1e3, 'M': 1e6, 'G': 1e9} 
def f(s): 
    mo = re.match(r'(\d+(?:\.\d+)?)([kMG])?', s) 
    return int(float(mo.group(1)) * factors.get(mo.group(2), 1)) 

print([f(d) for d in ds]) 
Смежные вопросы