2015-10-07 2 views
1

У меня есть проблемы со списками: У меня есть три списка:Логические операторы с тремя списками

Pipe_sizes = [15,15,22,15,32,45] 
Flow_rates = [0.1,0.3,1,2,0.4,1.5] 
Material_pipes = [Copper, Copper, PVC, Steel, Steel, Copper] 

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

If the material is Copper, I will use the follow logical operators: 
if Flow_rates <= 0.2 then the pipe size is 15 
if Flow_rates > 0.2 and <= 1 then the pipe size is 22 
if Flow_rates > 1 and <=1.9 then the pipe size is 32 
if Flow_rates > 1.9 then the pipe size is 45 

А для ПВХ я буду использовать следующие логические операторы:

if Flow_rates <= 0.1 then the pipe size is 15 
if Flow_rates > 0.1 and <= 1 then the pipe size is 22 
if Flow_rates > 1 and <=1.4 then the pipe size is 32 
if Flow_rates > 1.4 then the pipe size is 45 

И для стали I wil л использовать логические операторы следуют:

if Flow_rates <= 0.1 then the pipe size is 15 
if Flow_rates > 0.1 and <= 0.8 then the pipe size is 22 
if Flow_rates > 0.8 and <=1.5 then the pipe size is 32 
if Flow_rates > 1.5 then the pipe size is 45 

Если у меня не было списка Material_pipes, это было легко изменить список Pipe_sizes. Я мог бы использовать последующее решение:

def flow_rate_to_size(rate): 
    if rate <= 0.2: 
     size = 15 
    elif 0.2 < rate <= 1: 
     size = 22 
    elif 1 < rate <= 1.9: 
     size = 32 
    else: 
     size = 45 
    return size 

Flow_rates = [0.1, 0.3, 1, 2, 0.4, 1.5] 
Pipe_sizes = [Flow_rate_to_size(rate) for rate in Flow_rates] 
print(Pipe_sizes) 

Но что я могу сделать, если Pipe_sizes зависит также от списка Material_pipes?

+0

почему материалы встречаются более одного раза? – Pynchia

+0

Это разные трубы ... Некоторые из них - медь, некоторые - ПВХ, а некоторые - сталь. Поэтому мне нужно, чтобы проверить, какой материал это ... Благодаря Pynchia – Daniele

ответ

0

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

def flow_rate_to_size(rate, material): 
    size = -1 # good to set an error state 
    if material.lower() == 'copper': 
     if rate <= 0.2: 
      size = 15 
     elif 0.2 < rate <= 1: 
      size = 22 
     elif 1 < rate <= 1.9: 
      size = 32 
     else: 
      size = 45 
    elif material.lower() == 'pvc': 
     if rate <= 0.1: 
      size = etc.... 
    etc... 
    return size 
+0

благодаря BlivetWidget ... Я пытался использовать свое предложение, но он не работает .... Пожалуйста, посмотрите на то, что я сделал. (прокрутите страницу вниз) Спасибо. – Daniele

+0

Вы случайно оставили строки материала заглавными. После material.lower() у вас должна быть строка с более строгим нижним регистром или она всегда будет терпеть неудачу. Вам не нужно использовать этот метод, но это помогает устранить ошибку, если вы когда-либо пишете «медь» или «МЕДЬ» и т. Д. – BlivetWidget

1

Смотрите, если это то, что вы ищете:

from bisect import bisect 

material_pipes = {'Copper': (0.2, 1.0, 1.9), 
        'PVC': (0.1, 1, 1.4), 
        'Steel': (0.1, 0.8, 1.5)} 
pipe_sizes = [15,22,32,45] 

def flow_rate_to_size(material, rate): 
    pos = bisect(material_pipes[material], rate) 
    return pipe_sizes[pos] 

примеры:

print(flow_rate_to_size('Copper', 0.0)) 
print(flow_rate_to_size('Copper', 1.4)) 
print(flow_rate_to_size('Copper', 2.5)) 

производит:

15 
32 
45 
0
hi guys.... 

I don;t understand why but it doesn't work... 

have a look please... 

Pipe_sizes = [15,15,22,15,32,45] 
Flow_rates = [0.1,0.3,1,2,0.4,1.5] 
Material_pipes = ["Copper", "Copper", "PVC", "Steel", "Steel", "Copper"] 

def Flow_rate_to_size(rate,material): 
    size = -1 # good to set an error state 
    if material.lower() == 'Copper': 
     if rate <= 0.2: 
      size = 15 
     elif 0.2 < rate <= 1: 
      size = 22 
     elif 1 < rate <= 1.9: 
      size = 32 
     else: 
      size = 45 
    elif material.lower() == 'PVC': 
     if rate <= 0.1: 
      size = 15 
     elif 0.1 < rate <= 1: 
      size = 22 
     elif 1 < rate <= 1.4: 
      size = 32 
     else: 
      size = 45  
    elif material.lower() == 'Steel': 
     if rate <= 0.1: 
      size = 15 
     elif 0.1 < rate <= 0.8: 
      size = 22 
     elif 0.8 < rate <= 1.5: 
      size = 32 
     else: 
      size = 45  
    return size 


Pipe_sizes = [Flow_rate_to_size(rate,material) for rate in Flow_rates] 
print(Pipe_sizes) 
+0

Для дальнейшего использования, возможно, имеет смысл изменить исходный вопрос. Во всяком случае, я оставил комментарий в своем ответе, объяснив, что строки материала должны быть напечатаны в нижнем регистре для этих тестов. – BlivetWidget