2016-11-29 9 views
0

В данном наборе данных мне нужно умножить значения из разных блоков друг на друга.Доступ к значениям из следующей строки внутри цикла для продолжения и разрыва?

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

So,for X(set) I have to multiply: 0.25*0.1*0.83 (since they belong to same block

block X_set 
2480 0.25 
2480 0.1 
2480 0.083 
2651 0.43 
2651 0.11 
2651 0.23 

Мой код выглядит следующим образом:

test_q = open("test_question.txt", "r+") 
header = test_q.readline() 
data_q = test_q.read().rstrip("\n") 

product=1.0 
value_list = [] 

row = data_q.split("\n") 

for line in row: 
    block = line.split("\t") 
    X_list = block[1].split() 
    X_value = float(block[1]) 
    value_list = value_list + X_list 
    product = product*X_value 

print(value_list) 
print(product) 

Результат:

['0.25', '0.1', '0.083', '0.43', '0.11', '0.23'] 
2.2573925000000003e-05 

Но, в печати я хочу

['0.25', '0.1', '0.083'] 
0.0002075 

['0.43', '0.11', '0.23'] 
0.010879 

Итак, я хочу получить доступ к значению индекса из следующей строки, чтобы цикл for мог продолжать или прерываться.

Я попытался с помощью доступа к значению блока из следующей строки:

for i in range(0, len(row)-1): 
    next_line = row[i+1] 

Как я могу улучшить этот код?

Итак, как впрыскивать функцию break и continue внутри этой петли?

  • Я не хочу использовать фиксированное значение для блоков, так как это длинный файл и значение блока изменится.

  • Кроме того, строка с одинаковыми значениями блоков может быть не рядом друг с другом.

  • Кроме того, я не нуждаюсь в решении на пандах, так как это всего лишь часть большого файла, который является исключительным, заминированным с использованием цикла for-if-else.

Большое спасибо!

+0

Что не получилось о своем решении? –

+0

Я могу получить доступ к следующему набору строк и значений, используя метод 'for i in range'. Но я не могу разработать дополнительные условия, чтобы применять 'break' и' continue' для получения желаемых результатов. Можете ли вы внести какой-то вклад? – everestial007

ответ

3
from collections import defaultdict 
from functools import reduce 
from operator import mul 

res = defaultdict(list) 
with open('file') as f: 
    for r in f: 
     k, v = r.split() 
     res[k].append(v) 

for v in res.values(): 
    print(v) 
    print(reduce(mul, (float(f) for f in v), 1)) 

Ваша проблема в том, что вам нужно будет проверить каждую строку, чтобы найти совпадение, что было бы болью. проще просто хранить в дикторе, а затем распечатывать результаты в конце. (Если вы заботитесь о заказе, вы можете использовать OrderedDict)

редактировать для @ everestial007 то вопрос в комментариях:

res = defaultdict(lambda: 1.0) 
with open('file') as f: 
    for r in f: 
     k, v = r.split() 
     res[k] *= float(v) 
for k, v in res.items(): 
    res[k] = [str(v)] 
+1

На английском языке. Вы можете использовать столбцы блоков в качестве ключа для dict. Все записи с одним и тем же блочным кодом будут сохранены в том же списке. Затем вы можете перебирать список и, для каждого блочного кода, печатать список значений и их продуктов. –

+0

было бы лучше в космосе сохранить в 'res' продукт итерированного элемента, а не список из них. –

+0

@ GennadyKandaurov Я изначально написал это так, но он говорит, что хочет напечатать как значения компонентов, так и конечный продукт, поэтому я его изменил – acushner