2017-06-01 4 views
0

私が取り組んでいるプロジェクトでは、Excelファイルから取得した値に基づいて定義済みの価格層にアイテムを配置する必要があります。私はこの最後の部分を除いて、私の脚本には他のすべてが整えられています。私が行うことができるようにしたいどのようなリストからの戻り値が他の2つのリスト要素の間にある

は、(より良い/より効率的なオプションがある場合は、データ構造に貼り付けていない)リストのリストを構築する価値がi[0]i[1]i[2]を返すとの間にあるかどうかをチェックしています。

例は次のようになります。

my_value = 22.99 
[[0],[24.99],['0-24.99'],[25,49.99,'25-49.99]......] 

所望の出力:'0-24.99'

編集:

今私は戻って私のコンピュータにだと、私はこれを試してみて、プルするためのコードを書いていますオフ。

これらの関数は、計算と層の一致に使用されます。

#define functions 
    #calculate Eligible Average Selling Price 
    def asp(x,y): 
     if float(y)==0: 
      return 0 
     else: 
      return float(x)/float(y) 
    #Search Tiers Dictionary and return undefined if tier does not exist 
    def inTier(x,y,z): 
     for t in Tiers[x]: 
      if float(t[0]) <= asp(y,z) <= float(t[1]): 
       return t[2] 
      else: 
       return 'Tier Undefined' 

ここは、階層に一致するようにループしている辞書です。

Tiers= {'Desktop':[[0, 24.99, '0-24.99'],[25, 49.99, '25-49.99'],[50, 74.99, '50-74.99'],[75, 99.99, '75-99.99'],[100, 124.99, '100-124.99'],[125, 149.99, '125-149.99'],[150, 199.99, '150-199.99'],[200, 249.99, '200-249.99'],[250, 299.99, '250-299.99'],[300, 499.99, '300-499.99'],[500, 749.99, '500-749.99'],[750, 999.99, '750-999.99'],[1000, 1999.99, '1000-1999.99'],[2000, 2999.99, '2000-2999.99'],[3000, 9999.99, '3000-9999.99']],'Chair':[[0, 24.99, '0-24.99'],[25, 49.99, '25-49.99'],[50, 74.99, '50-74.99'],[75, 99.99, '75-99.99'],[100, 124.99, '100-124.99'],[125, 149.99, '125-149.99'],[150, 199.99, '150-199.99'],[200, 249.99, '200-249.99'],[250, 299.99, '250-299.99'],[300, 499.99, '300-499.99'],[500, 749.99, '500-749.99'],[750, 999.99, '750-999.99'],[1000, 1999.99, '1000-1999.99'],[2000, 2999.99, '2000-2999.99'],[3000, 9999.99, '3000-9999.99']],'Gear':[[0, 9.99, '0-9.99'],[10, 24.99, '10-24.99'],[25, 49.99, '25-49.99'],[50, 74.99, '50-74.99'],[75, 99.99, '75-99.99'],[100, 124.99, '100-124.99'],[125, 149.99, '125-149.99'],[150, 199.99, '150-199.99'],[200, 249.99, '200-249.99'],[250, 299.99, '250-299.99'],[300, 349.99, '300-349.99'],[350, 399.99, '350-399.99'],[400, 499.99, '400-499.99'],[500, 749.99, '500-749.99'],[750, 999.99, '750-999.99'],[1000, 1999.99, '1000-1999.99'],[2000, 2999.99, '2000-2999.99'],[3000, 9999.99, '3000-9999.99']],'Laptop':[[0, 49.99, '0-49.99'],[50, 99.99, '50-99.99'],[100, 149.99, '100-149.99'],[150, 199.99, '150-199.99'],[200, 249.99, '200-249.99'],[250, 299.99, '250-299.99'],[300, 349.99, '300-349.99'],[350, 399.99, '350-399.99'],[400, 449.99, '400-449.99'],[450, 549.99, '450-549.99'],[550, 649.99, '550-649.99'],[650, 749.99, '650-749.99'],[750, 999.99, '750-999.99'],[1000, 4999.99, '1000-1999.99'],[2000, 6999.99, '2000-6999.99']],'Printer':[[0, 24.99, '0-24.99'],[25, 49.99, '25-49.99'],[50, 74.99, '50-74.99'],[75, 99.99, '75-99.99'],[100, 124.99, '100-124.99'],[125, 149.99, '125-149.99'],[150, 199.99, '150-199.99'],[200, 249.99, '200-249.99'],[250, 299.99, '250-299.99'],[300, 499.99, '300-499.99'],[500, 749.99, '500-749.99'],[750, 999.99, '750-999.99'],[1000, 1999.99, '1000-1999.99'],[2000, 2999.99, '2000-2999.99'],[3000, 9999.99, '3000-9999.99']],'Tablet':[[0, 49.99, '0-49.99'],[50, 99.99, '50-99.99'],[100, 149.99, '100-149.99'],[150, 199.99, '150-199.99'],[200, 249.99, '200-249.99'],[250, 299.99, '250-299.99'],[300, 349.99, '300-349.99'],[350, 399.99, '350-399.99'],[400, 449.99, '400-449.99'],[450, 549.99, '450-549.99'],[550, 649.99, '550-649.99'],[650, 749.99, '650-749.99'],[750, 999.99, '750-999.99'],[1000, 1999.99, '1000-1999.99'],[2000, 4999.99, '2000-4999.99']]} 

そしてここ値が

row=[row[0],row[1].split(" ")[1],row[2].split(" ")[1],int(re.findall(r'\d+', row[3])[0]),row[4],row[5],row[6],asp(row[5],row[6]),inTier(row[0],row[5],row[6])] 

及び「未定義ティア」を返す例行リストの行にリスト行から評価されているところである。

['Gear', 'REGION 27 SOUTHEAST', 'DISTRICT 7 E ATL', 'LOGANVILLE GA (6852)', 'WNDA3100 RANGEMAX', '32.99', '1'] 

で一般的に、肯定的な一致を得る唯一の層はリストの辞書の最初の値です。

+1

別々のサブ配列の最初の3ですが、なぜ次のグループは単一のサブアレイにありますか? – Barmar

+0

'i [0] <= my_value <= i [1]の場合:返信i [2]' – Barmar

+0

@Barmarは私の部分に明瞭さがありません。ループでは、層の中で私のようなものから始まります: –

答えて

0

私はあなたのリストには誤植があると仮定して、あなたが書くためのもの:

tiers = [[0,24.99,'0-24.99'],[25,49.99,'25-49.99]......] 

それらを介し次に、あなただけのループ:

for tier in tiers: 
    if tier[0] <= my_value <= tier[1]: 
     selected_tier = tier[2] 
     break 
+0

入手しました。 500,000の値を持つバッチを循環させる必要がある場合は、これが最善の方法でしょうか? –

+0

これらの例のように、すべてのティアの範囲は25ですか?もしそうであれば、分けることができます。 – Barmar

+0

いいえ、それは変わります –

関連する問題