2014-02-19 7 views
0

Я новичок в python, и мне нужна помощь для создания/представления массива из этого типа данных.Каков наилучший способ сделать массив из моих данных в python?

link1|2-3,6-9,12-13|4-5,10-11,14-16 

Формат link_name|boundary1|boundary2 Мне нужно вставить значения A в boundary1 и B к boundary2

Что должно привести к этому:

position : 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
value : A A B B A A A A B B A A B B B 
+0

btw, длина границ варьируется - например, 2-78, 100-125 и т. Д. Приведенные выше данные выборки предназначены только для целей презентации. надеюсь это поможет. – user3267156

+2

Я думаю, вам нужно продемонстрировать попытку решить проблему, прежде чем кто-то потратит время на то, чтобы помочь вам – ninesided

ответ

0

Это то, что я придумал:

data = data.split('|')[1] 
data = data.split(',') 
data = [d.split('-') for d in data] 
data = [(int(d[0]), int(d[1])) for d in data] 

positions = range(2, 17) 
values = ['A' if any(data[j][1] >= i >= data[j][0] for j in range(len(data))) else 'B' for i in positions] 

В принципе, любая информация, кроме первого списка диапазонов, не требуется, потому что все, что не является «A», равно «B» по умолчанию. Я положил свои данные диапазоны в этом формате, используя первые четыре строки моего кода:

[(2,3), (6,9), (12,13)] 

, а затем идет список понимание для классификации данных.

+0

, когда я попробовал первые 4 строки ... произошла ошибка ... Traceback (последний последний звонок): Файл «» , строка 1, в IndexError: индекс списка за пределами допустимого диапазона – user3267156

+0

@ user3267156 распечатайте ваши данные и посмотрите, как они выглядят. Этот код отлично работает с записью, которую вы указали в своем вопросе. – sashkello

+0

все работает сейчас ... извините, мое плохое! – user3267156

0

Возможно, вы хотите что-то вроде словаря.

line = "link1|2-3,6-9,12-13|4-5,10-11,14-16" 
a, b = line.split("|")[1:] 
a = [item for i in a.split("-") for item in i.split(",")] 
b = [item for i in b.split("-") for item in i.split(",")] 
data = {k:"A" for k in a} 
data.update({k:"B" for k in b}) 

print data 
0

Вам может понадобиться словарь в Python:

data = {} 
def mapToDict(boundary, value): 
    for item in boundary.split(','): 
     for position in item.split('-'): 
      data[position]=value 

s='link1|2-3,6-9,12-13|4-5,10-11,14-16' 
items = s.split('|') 

mapToDict(items[1],'A') 
mapToDict(items[2],'B') 

print data 

Выход:

{'11': 'B', '10': 'B', '13': 'A', '12': 'A', '14': 'B', '16': 'B', '3': 'A', '2': 'A', '5': 'B', '4': 'B', '6': 'A', '9': 'A'} 
1

Хотя, вероятно, не так эффективно, как словарем на основе подходов, это получает работу сделали слишком:

data = "link1|2-3,6-9,12-13|4-5,10-11,14-16" 
link_name, boundary_1, boundary_2 = data.split("|") 
boundary_1 = [(b, "A") for b in boundary_1.split(",")] 
boundary_2 = [(b, "B") for b in boundary_2.split(",")] 
temp = boundary_1 + boundary_2 
# We sort the temp list based on the starting point 
temp = sorted(temp, key=lambda x: int(x[0].split("-")[0])) 
position = [] 
value = [] 
for pair, letter in temp: 
    start, stop = pair.split("-") 
    # We loop through all the intermittent values that are not in the input 
    for val in range(int(start), int(stop)+1): 
     position.append(val) 
     value.append(letter) 

print "position:\t{}".format("\t".join([str(x) for x in position])) 
print "value: \t{}".format("\t".join([x for x in value])) 

Этот ген erates выход, как вы просили (с разделением вкладок):

position: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
value:  A A B B A A A A B B A A B B B 
+0

спасибо ivo, это очень полезно! – user3267156

+0

Добро пожаловать! Я надеюсь, что он решил вашу проблему, потому что я думаю, что некоторые из других предложений не совсем правильны –

0
def create_lsit(boundry_list): 
    list_t = [] 
    for i in boundry_list: 
      l = i.split('-') 
      ran = range(eval(l[0]),eval(l[1])+1) 
      for j in ran: 
       list_t.append(j) 
    return list_t 

def create_dic(dic,input_list, val): 
    for i in input_list: 
     dic[i] = val 

def get_some(link_name,boundary1,boundary2): 
     main_dic = {} 
     boundry1 = create_lsit(boundary1.split(',')) 
     create_dic(main_dic,boundry1, 'a') 
     boundry2 = create_lsit(boundary2.split(',')) 
     create_dic(main_dic,boundry2, 'b') 

     for key in sorted(main_dic.keys()): 
      print key, ' ', main_dic[key] 

data = 'link1|2-3,6-9,12-13|4-5,10-11,14-16'.split('|')  
get_some(data[0],data[1],data[2]) 

Это может быть длительным, но я думаю, что это то, что вы искали.

Смежные вопросы