Python: список списков целых чисел с абсолютным значением до одного числа - PullRequest
0 голосов
/ 16 декабря 2009

Если бы у меня был список из списка целых чисел, скажите:

[['12' '-4' '66' '0'], ['23' '4' '-5' '0'], ['23' '77' '89' '-1' '0']]

Я хотел преобразовать числа в их абсолютные значения, а затем в одно число, поэтому на выходе получится:

1246602345023778910

Ответы [ 5 ]

2 голосов
/ 16 декабря 2009

То, что вы показываете (может быть) список списков строк, и синтаксис чрезвычайно своеобразен - подсписки показаны с обычными, обычными запятыми, но внутри каждого есть просто буквенные строки с пробелами между ними , Если вы на самом деле наберете это в Python, вы получите список, в котором каждый подсписок содержит одну строку - Python, подобно C, объединяет во время компиляции строковые литералы, которые просто сопоставляются с пробелами в середине.

Предполагая, что вы действительно хотели иметь подсписки из нескольких строк каждая, с соответствующими запятыми, и что ваши упоминания о «списках чисел» (а это не то, что у вас есть - у вас есть списки строк! что-то вроде:

''.join(c for L in thelist for c in L).replace('-', '')

, вероятно, лучше всего - просто работать на строковом уровне (поэтому заменяйте тире ничем, вместо использования abs), так как вам все равно нужны строки для целей конкатенации / объединения.

Если вы хотите сделать это самым сложным способом,

''.join(str(abs(int(c))) for L in thelist for c in L)

также будет работать (и более точно соответствовать тому, что вы просите), но первая идея лучше.

1 голос
/ 16 декабря 2009

Вы можете использовать itertools.chain здесь, чтобы избавиться от вложенности, объединить числовые строки, удалить знаки «-» и затем превратить их в число.

import itertools
mylist = [['12' '-4' '66' '0'], ['23' '4' '-5' '0'], ['23' '77' '89' '-1' '0']]
num = int( ''.join(itertools.chain(*mylist)).replace('-','') )

Редактировать: ранее я пропустил требование абс.
Второе редактирование: используется замена, которая, вероятно, более эффективна, чем str (abs (int (n))), а также менее неуклюжа (любезно: ответ Алекса)

1 голос
/ 16 декабря 2009

То, что вы дали выше, это список списков строк.

Я предлагаю двухпроходный подход:

  1. Получить целые числа из строк и взять их абсолюты:

    [abs (int (s)) для s в списке]

  2. Объедините эти числа в строку и превратите их в целое число

    ''. Join (['' .join (x) для x в списках списков])

Когда вы объединяете эти два подхода, вы получаете:

>>> listoflists = [['12','-4','66','0'],['23','4','-5','0'],['23','77','89','-1','0']]
>>> int(''.join([ ''.join([ str(abs(int(s))) for s in list ]) for list in listoflists ]))
1246602345023778910L

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

Примечание: если у вас действительно был список целых чисел, хотя, как вы сказали, тогда это намного проще:

>>> listofints = [12,-4,66,0,23,4,-5,0,23,77,89,-1,0]
>>> int(''.join( [ str(abs(x)) for x in listofints ]))
1246602345023778910L
0 голосов
/ 16 декабря 2009

Как указано в других ответах, ваши внутренние списки не такие «списочные», как кажутся. Поскольку запятые отсутствуют, я думаю, что Python объединит их все в одну строку, что даст вам список из одного элемента. Это будет так же, как это:

[['12-4660'], ['234-50'], ['237789-10']]

В любом случае, вы можете просто удалить все, что не является цифрой, чтобы получить ваш результат (это будет работать с запятыми или без):

''.join(x for x in str(mylist) if x.isdigit())
0 голосов
/ 16 декабря 2009

Я новичок в Python, поэтому, пожалуйста, прости меня, если есть более эффективный способ:)

#!/usr/bin/python

str = ''
lists = [['12' '-4' '66' '0'], ['23' '4' '-5' '0'], ['23' '77' '89' '-1' '0']]

for list in lists:
  str += list[0].replace('-', '')

print int(str)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...