2015-05-20 148 views
0

我有包含在以下格式的数据文件discount.txt将其存储在一个列表:解析文本文件和

Less than $100 --> 0% 
From $100 up to less than $500 --> 10% 
From $500 up to less than $1,000 --> $40 PLUS 20% 
From $1,000 up to less than $2,000 --> $140 PLUS 30% 
$2,000 and above --> $440 PLUS 40% 

这意味着在销售金额

Less than $100 0% 
From $100 up to less than $500 10% for each dollar over $100 
From $500 up to less than $1,000 $40 PLUS 20% of the total sale amount over $500 
From $1,000 up to less than $2,000 $140 PLUS 30% of the total sale amount over $1,000 
$2,000 and above $440 PLUS 40% of the total sale amount over $2,000 

也就是说折扣,如果总销售额为100美元,那么折扣将为0美元。但是,如果总销售额为$ 101,则折扣将为$ 0.10。如果总销售额为500美元,则折扣将为40美元,但如果总销售额为501美元,则折扣将为40.20美元。

为了解决这个问题,我认为有4个清单:1个用于存储销售额下限的清单,1个用于上限的清单,1个用于存放与范围相对应的固定增量的清单,以及一个用于存放额外打折的清单。如果没有固定增量,则将其假设为零。

那么对于给定的销售额,如果它位于第i范围内,那么只是这样做:

fixedIncrement[i] + (saleAmount-lowerLimit[i])*additionDiscount[i] 

但是问题现在面临被解析给定的文本文件。是否有人可以帮助解析它,它

这里存放在列出蟒蛇在给定的文件列表会是这样的:

lowerLimit[] = [1,100,500,1000,2000] 
upperLimit[] = [100,500,1000,2000,MAX] 
fixedIncrement[] = [0,0,40,140,440] 
additionDiscount[] = [0,0.1,0.2,0.3,0.4] 
+0

@Prera​​kSola我解释我的做法。我想知道除了我在想什么之外是否还有更好的替代方案。我的代码有点混乱。我采取了每条线并解析它。我希望有一些优雅的方式来做到这一点 – ms8

+1

你解释了你的计算方法。但是你提到的问题是解析文本文件。那么到目前为止,您尝试解析该文本文件的是什么?那么错误/不需要的行为是什么? –

+0

@python_slayer最有可能的方法将是相同的:你取一行,正则表达式的值并将它们存储在列表列表中。然后,从初始列表中的每个列表的i ++元素创建列表的新列表。 – konart

回答

0

要打开一个.txt:

with open ("data.txt", "r") as myfile: 
    data=myfile.readlines() 

每行应是在列表的字符串例如[ '串一个',线二'] 每个字符串转换为字符串列表

all_lines = [i.split() for i in data] 
>>> all_lines = [['string', 'one'], ['string', 'two']] 

for l in all_lines: 
    # Go through each line 

从$ 100达不到$ 500 - > 10%转化为:

l = ['From', '$100', 'up', 'to', 'less', 'than', '$500', '-->', '10%'] 

现在你应该能够使用逻辑来解析它。例如获得的参数范围内这一行的:

all_ranges = [] 
r1 = [i for i in l if "$" in i] 
if l[0] == 'From': # Contains a range  
    r = (int(r1[0][1:]), int(r1[1][1:])) 
    all_ranges.append(r) 

print all_ranges 

>>> [(100, 500)] 

编辑:

elif l[0] == "Less": # No range in this line 
    r = (0, int(r1[0][1:])) # Range is from 0 to $100 
    all_ranges.append(r) 
else: 
    top = l[0][1:] 
    all_ranges.append((top, 1000000)) # High range 

>>>> [(100, 500), (0, 100), (2000, 1000000)] 
+0

那些不包含'From'的行呢?您能否请全文解释文本?像第一行一样少于100美元,最好包含范围(1,100)。同样的最后一行upto最大限制 – ms8

+0

最后一个疑问,如何加载文本文件为csv字符串? – ms8

+0

使用类似reader = csv.reader(csvfile,delimiter ='')的东西。请参阅http://stackoverflow.com/questions/17262256/reading-one-line-of-csv-data-in-python – kezzos

0

你可以按照这个方法:

  1. 创建您的数据的CSV文件。这将降低阅读文件的复杂性。该格式可以是这样的:

LOWER_LIMIT,UPPER_LIMIT,fixed_increment,折扣
1,100,0,0
100,500,0,0.1
500,1000,40,0.2

  1. 使用python的csv模块读取文件并将值存储在相应的列表中。你可以在这里看到关于它的文件:Python docs
  2. 根据你的公式计算金额。
+0

我不想制作单独的文件。我可以修改我的数据结构,但没有其他文件。我必须使用正则表达式和所有的解析它 – ms8

+0

@python_slayer所以你在一个类中这样做。 –

+0

@Prera​​ksola在课堂上? – ms8