2016-09-19 2 views
0

У меня следующие два типа ввода:Как изменить функцию .split для применения к различным буквенным числовым входам?

## Case 1 (a) 
# Input #1(a) 
>qrst 
ABC 10 9 7 
>qqqq 
ACC 2 5 3 

# Case 1 (b) --> Simplified form of Case 1(a) 
# Input #1() 
>qrst 
A 10 
>qqqq 
A 2 

# After reading in the file and making it a list I store the above in l 
l = ['ABC 10 9 7', 'ACC 2 5 3'] # Case 1(a) 
l = ['A 10', 'A 2'] # Case 1(b) 

#In the following code I split the alpha-numeric elements above and 
#create separate lists where I store the alphabets alone (in list "sequences") and 
#numeric alone (in list "qualities") 

ll = len(l) 
all_inputs = [] 
for i in range(0,ll): 
    sq = l[i] 
    sequence = sq.split(" ")[0] ## Stores only the alphabets 
    qualities = sq.split(" ")[1:] ## Stores only the numeric 
    qualities = filter(None, qualities) 
    for sub in sequence: 
     if sub == "-": 
      idx = list(sequence).index(sub) 
      qualities.insert(idx,"0") 
    all_inputs.append((sequence, qualities)) 
    print 

    #Case1(a) Output reads currently reads as 
    A #print sequence 
    ['2'] #print qualities 

я сталкиваюсь другой тип входного файла следующим образом:

## Case 2 
# Input #2 
>qrst 
A #No space after A 

10 
>qqqq 
A #No space after A 

2 

Here 
l = ['A10', 'A2'] 

I use the same code as above 

#Case2 Output reads currently reads as 
A2 #print sequences 
[] #print qualities 

мне нужно #case 2 также иметь выход последовательность #print ['2'] #print качества

Как изменить приведенный выше код, чтобы он мог вместить как ['ABC 10 9 7', 'ACC 2 5 3'], так и ['A 10', 'A 2 '] или [' A10 ',' A2 '] входного файла /' l «? Мне нужен случай 2, чтобы иметь тот же результат, что и случай 1 (b), поэтому я могу применить одну и ту же строку кода позже. Но помните, что это должен быть обобщенный код для случая 1 и случая 2.

+0

Звуки, как вы просите домашних заданий. Это не то, для чего этот сайт. –

+0

Кроме того, ваш вопрос не очень корректный. –

+0

Пожалуйста, пересмотреть свой вопрос, чтобы быть более понятным, как каждый из ваших входов образца должен вести себя с точным ожидаемым выходом. Пожалуйста, прочитайте, как собрать [mcve], чтобы помочь в редактировании вашего вопроса, чтобы он был хорошо принят. – idjaw

ответ

0

Регулярное выражение будет хорошим подходом для этого, вы ищете письмо ([A-Z]), а затем дополнительное пространство ?, за которым следует один или несколько цифры (\d+):

>>> import re 
>>> re.match('([A-Z]) ?(\d+)', 'A10').groups() 
('A', '10') 
>>> re.match('([A-Z]) ?(\d+)', 'A 10').groups() 
('A', '10') 
+0

Но как это сделать для большой последовательности? Что у меня было l = ['A10', 'A2', 'C8', 'D20']? и мне нужно разбить их все – biogeek

+0

, как в вашем коде, используйте цикл и примените его к каждому элементу. – maxymoo

+0

Я не знаком с re.match. Поэтому, если у меня есть 'l = ['A10', 'A2', 'C8', 'D20']' моя следующая строка читает 'для i в l:' 're.match ('([AZ])? (\ d +) ',' i''i + 1 '). groups() '. Какие типы входов он принимает? – biogeek

0

бы эта работа:

import re 

input_seq = "A10 B 20 C30 D1 Z 67" 
input_raw = re.split(r'([A-Z]) *(\d+)' , input_seq) 
input_clean = [x for x in input_raw if x and not x.isspace()] 
print zip(input_clean[::2], input_clean[1::2]) 

дает:

[('A', '10'), ('B', '20'), ('C', '30'), ('D', '1'), ('Z', '67')] 

если изменить последнее выражение:

print [ "{} {}".format(*x) for x in zip(input_clean[::2], input_clean[1::2]) ] 

вы получите:

['A 10', 'B 20', 'C 30', 'D 1', 'Z 67'] 

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

input_seq = "A10 B 20 C30 D1 Z 67" 
print re.sub(r'([A-Z]) *(\d+)', r'\1 \2', input_seq) 

отпечатывается:

A 10 B 20 C 30 D 1 Z 67 

, если вы хотите, чтобы изменить список входов:

l = ['A10', 'A2'] 
l = [ re.sub(r'([A-Z]) *(\d+)', r'\1 \2', x) for x in l] 
print l 

Печатается:

['A 10', 'A 2'] 
+0

Я изменил вопрос. Посмотрите на случай 1 (a) и случай 1 (b). Случай 1 (b) и 2, являются «особыми случаями» дела 1 – biogeek

+0

, приводят пример 1 (a) для случая 2, является ли это «ABC2 3 3»? – perreal

+0

Хорошо, просто рассмотрите 3 случая. Случай A 'l = ['ABC-10 9 7 2', 'ACC-2 5 3 0']', Случай B 'l = ['A 10', 'A 3']', Случай C 'l = [ 'A10', 'A3'] '. «Аписцы» могут иметь «алфавиты и символы типа« - »или«? » – biogeek