2011-09-01 143 views
0

我不熟悉python,需要幫助將包含字符串和數字(​​全部表示爲字符串!)的列表轉換爲僅包含數字的新列表。將字符串的混合列表轉換爲整數列表

  • 輸入字符串:['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0']
  • 結果所需要的:[0x00134,0,0,0x1df0,0x1df0]

像 'LOAD' 和 'R', 'E' 的所有非數字的條目應被刪除。

+0

它只是您期望的十六進制和十進制數? –

回答

0
def list2num(mylist): 
    result = [] 
    for item in mylist: 
     try: 
      if item.lower().startswith("0x"): 
       result.append(int(item, 16)) 
      else: 
       result.append(int(item)) 
     except ValueError: 
      pass 
    return result 

這給你

>>> numbers = ['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0'] 
>>> list2num(numbers) 
[308, 0, 0, 7664, 7664] 

或者更好,如果你只需要一個迭代,我們沒有建立在內存結果列表:

def list2num(mylist): 
    for item in mylist: 
     try: 
      if item.lower().startswith("0x"): 
       yield int(item, 16) 
      else: 
       yield int(item) 
     except ValueError: 
      pass 
+0

您的代碼將十六進制數轉換爲十進制數,但問題在結果中將它們列爲十六進制數。 – Albireo

+0

@Albireo:Python中沒有這樣的十六進制數字,只有整數(或者它們的字符串表示可能在十六進制中) –

2
input = ['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0'] 

def tryInt(x): 
    base = 10 
    if x.startswith('0x'): base = 16 
    try: return int(x, base) 
    except ValueError: return None 

filter(lambda x: x is not None, map(tryInt, input)) 
0

您可以使用此功能:http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Python

def is_numeric(lit): 
    'Return value of numeric literal string or ValueError exception' 

    # Handle '0' 
    if lit == '0': return 0 
    # Hex/Binary 
    litneg = lit[1:] if lit[0] == '-' else lit 
    if litneg[0] == '0': 
     if litneg[1] in 'xX': 
      return int(lit,16) 
     elif litneg[1] in 'bB': 
      return int(lit,2) 
     else: 
      try: 
       return int(lit,8) 
      except ValueError: 
       pass 

    # Int/Float/Complex 
    try: 
     return int(lit) 
    except ValueError: 
     pass 
    try: 
     return float(lit) 
    except ValueError: 
     pass 
    return complex(lit) 

這樣:

def main(): 
    values = ['LOAD', '0x00134', '0', '0', 'R', 'E', '0x1df0', '0x1df0'] 
    numbers = [] 
    for value in values: 
     try: 
      number = is_numeric(value) 
     except ValueError: 
      continue 
     numbers.append(number) 
1

可能是矯枉過正,而是一個非常靈活的解決方案。您可能希望以後支持八進制或羅馬數字;-)

import re 

parsing_functions = [ 
    (r'^(\d+)$', int), 
    (r'^0x([\dA-F]+)$(?i)', lambda x:int(x,16)) 
] 
parsing_functions = [(re.compile(x),y) for x,y in parsing_functions] 

def parse_integers(input) : 
    result = [] 
    for x in input : 
     for regex, parsing_function in parsing_functions : 
      match = regex.match(x) 
      if match : 
       result.append(parsing_function(match.group(1))) 
    return result 

input = ['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0'] 
print parse_integers(input) 
相關問題