On 09/06/2016 04:55 PM, GP wrote:
I have a list:
shelves2 =[{'Part No': '1', 'Length': 610.0,  'Width': 50.0},
        {'Part No': '2', 'Length': 2319.0, 'Width': 465.0 },
        {'Part No': '3', 'Length': 5.0,'Width': 465.0}]

The length of shelf is calculated as follows:
  1. Calculate the maximum length of all items in the shelf.
  2. Calculate width of shelf = 610 (in this case).
  3. Length of shelf : maxlength of all items + length ( if it less than width 
of shelf) or width of other items such that length of shelf  is less than 
maximum allowed length.

In the above case the length is 2319+50+5 = 2374. I have the following code which generates it 
correctly but would like to know if there is a better way to write it. I would like to know some 
smarter way to write the code ( especially if the "for", "if" statements can be 
avoided).
   list_1=[]
   list_2=[]
   WidthOfShelf = max([x['Width'] for x in shelves2])
   MaxLengthOfItem =  max([x['Length'] for x in shelves2])
   f_LMax=lambda seq, m: [ii for ii in range(0, len(seq)) if seq[ii] ['Length'] 
>= m][0]
   MaxLengthOfItem_Index =f_LMax(shelves2,MaxLengthOfItem)
   current= MaxLengthOfItem

   list_1=[shelves2[MaxLengthOfItem_Index]]
   list_2 = [MaxLengthOfItem]
   del shelves2[MaxLengthOfItem_Index]
   for i in range(0,len(shelves2)):
        if shelves2[i]['Length'] <= Width:
            if (current + shelves2[i]['Length']) or (current + shelves2  
[i]['Width'])<= 2438.5 :
                q_2= min(shelves2[i]['Length'],  shelves2[i]['Width'])
                q=shelves2[i]
                list_1.append(q)
                list_2.append(q_2)
                current += (shelves2[i]['Length'] or shelves2[i]  ['Width'])
                length = sum(list_2)
   print("LENGTH:",length)



Hi,

Your code does not make any sense. Before making it smarter, you need to make it understandable if you want us to help you.

It's ok to write quick and dirty scripts, until you send them for others to review :)

Here are my advices:

1/ use meaningful names
* list_1, list_2, q_2, q, current give no clue about what information they're supposed to hold
  * you can use comments instead as sometimes a short name won't do it

2/ provide code that reproduces your problem, executing the above code gives a NameError.
---> 30      if shelves2[i]['Length'] <= Width:
NameError: name 'Width' is not defined

3/ name different things with different names. at the end of your code you're printing "length", which is the sum of either length or width fields. It's difficult to guess what you're trying to achieve. Same confusion about the field 'Length' of a shelf, and the length of a shelf that is computed elsewhere. My guess would be that a shelf has an innate length, and another one depending on the shelves it's inserted into. If so, find 2 different names.

4/ You are iterating like a C/C++ addict. Short story: resist the urge to iterate over indexes.

for i in range(0,len(shelves2)):
    print(shelves2[i]['Length'])

is best written

for shelf in shelves2:
   print(shelf['Length'])

long story : http://nedbatchelder.com/text/iter.html

5/ use list comprehension to create filtered list:

for shelf in [s for s in shelves2 if s['Length'] <= s['Width']]:
   ...


Hope it helps somehow.

jm

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to