summing up the values in a dictionary - python-2.7

I created a dictionary with the following syntax
frequency_m= dict(zip(unique, counts))
which results into:
{0: 3512488, 1: 2606, 2: 3553, 3: 3929, ..........}
I want to classify the key, value pairs as binary - '1' or '0'. Below I represented
for k, v in frequency_m.iteritems():
if k ==0:
print '0', v
else:
print '1', sum(v)
obviously that generates TypeError: 'numpy.int64' object is not iterable. I am sure I need to iterate over the values and sum that up for the values other than '0'. I am not getting it. Any thoughts?
0 3512488
1 2606
1 3553
1 3929
my goal here is to output the table as
0 3512488
1 10088
I tried following as well: ** np.sum((value for key, value in frequency_m.iteritems() if key != '0'))**, it sums up all the values and does not yield my goal.

Just change your comprehension to check for 0 instead of '0':
np.sum((value for key, value in frequency_m.iteritems() if key != 0))

Related

How do I have a user enter values between 1 and 5, where 1 will return the employee information saved in the list index [0] in python [duplicate]

I am very new to programming in Python, this is something that seems so simple, but I just don't seem to be able to get it right.
I have a list of values.
I want to prompt the user for input.
Then print out the value that's at the corresponding index number in the list.
myList [0, 1, 20, 30, 40]
choice = input()
print (......)
If the user inputs 2, I want to print the the value that is at the index 2 (20). I am unsure of what to put after print.
You can do this by accessing the list using the given input by the user.
The input given by the user I assume would be a String, so we need to use int() to change it to an integer.
print myList[int(choice)]
Additionally, you may want to first check the validity of the input supplied; it cannot be less than 0, or more than the length of the list - 1;
choice = int(choice)
if (choice < 0 || choice >= len(myList))
print('Not Valid')
else
print myList[int(choice)]

python 2.7 iterate on list printing subsets of a list

I have this list: l = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] and I would like to iterate on it, printing something like
0: [1,2,3,4]
1: [2,3,4,5]
2: [3,4,5,6]
...
n: [17,18,19,20]
So far I made this code to print 5 elements at a time, but the last iteration prints 3:
for index, item in enumerate(l):
if index == 0 or index == 1 or index == 2:
continue
print index, l[index - 3:index + 2]
How can I solve this?
You're on the right track with your list slices. Here's a tweak to make it easier:
sub_len = 4
for i in range(len(mylist) - sub_len + 1):
print l[i:i + sub_len]
Where sub_len is the desired length of the slices you print.
demo

Take first N keys by max value from dict {key:list}

is there have easy way to take first N keys which have max value from they list in dict {key:list}
is there have easy way to take first N keys which have max value from they list in dict {key:list}
def main():
for x in range(len(sale10k)):
timelist.append(sale10k[x][3])
pricesList.append(sale10k[x][4])
if sale10k[x][0] in salesByCategory.keys():
salesByCategory[sale10k[x][0]].append(float(sale10k[x][4]))
else:
salesByCategory[sale10k[x][0]]=[]
salesByCategory[sale10k[x][0]].append(float(sale10k[x][4]))
salesByCategory1={}
for key,value in salesByCategory.items():
salesByCategory1[key]=sum(salesByCategory.get(key))
#fiveLarges=heapq.nlargest(5,salesByCategory1,key=salesByCategory1.get)
salesBycatalog={}
for y in range(len(catalog)):
salesBycatalog[catalog[y][0]]=catalog[y][5]
totalByGroup={}
for key, value in salesBycatalog.items():
if value in totalByGroup.keys():
totalByGroup[value].append(salesByCategory1.get(key))
else:
totalByGroup[value]=[]
totalByGroup[value].append(salesByCategory1.get(key))
print(totalByGroup)
if __name__ == "__main__":
main()
i have 2 files excel.cvs
my output from now is this :
{'POLO SHIRTS': [2609.76, 13339.109999999991, 15622.410000000007], 'APPAREL ACCESSORIES': [22596.24999999999, 20901.099999999995, 31007.8], 'PANTS': [8031.729999999998, 11179.949999999999, 5405.839999999997, 9023.949999999999, 21523.819999999996, 26030.800000000017], 'FOOTWEAR ACCESSORIES': [8686.369999999999], 'GLIDING SP.EQUIPMENT': [22136.399999999987, 27678.920000000006, 14222.21999999999, 30013.37000000001], 'SHOES': [1903.66, 25443.21999999999, 22152.530000000006, 11585.410000000002, 38504.679999999986, 7787.670000000004, 10256.860000000002, 1377.1199999999997, 15459.799999999992, 20919.56000000001, 6299.769999999996, 1555.4499999999998, 17470.460000000006, 29361.220000000034, 4070.9000000000033, 27045.450000000004, 20721.829999999994, 780.55, 24671.590000000015, 13189.570000000002, 6442.700000000001, 6105.390000000005, 12701.659999999998, 29418.89000000001, 7295.620000000001, 26344.420000000002, 3262.12, 11710.460000000006, 3272.2999999999993, 17055.989999999994, 9019.77, 12722.570000000003, 20020.150000000005, 30164.860000000026, 17513.14, 3168.6200000000003, 27008.24, 14585.679999999988, 15273.48, 24172.329999999998, 33968.96000000003, 35480.790000000015, 25150.459999999992, 24207.679999999997, 26909.090000000007, 17692.079999999998, 27844.97999999999, 33847.389999999985, 13266.239999999994, 11757.349999999997, 24469.410000000018, 8214.879999999997, 3966.6899999999964, 5336.910000000003, 27766.659999999978, 24636.97000000002, 21330.829999999994, 10331.680000000004, 19769.529999999995, 20764.439999999984, 2873.509999999999, 23263.23, 15127.240000000003, 13282.320000000003, 32917.03000000001, 17657.12, 9959.55, 21052.779999999995, 16015.79, 2667.2699999999995, 16041.830000000004, 2309.9000000000005, 8095.450000000001, 23628.889999999985, 3846.259999999999, 6795.61, 14608.109999999995, 6422.360000000001, 3241.279999999999, 19220.27999999999, 20836.899999999994, 28446.07000000001, 13984.979999999992, 10006.460000000003, 14417.309999999998, 9069.470000000001, 8081.38, 1766.8899999999999, 19041.750000000004, 3310.279999999999, 3649.49, 11089.069999999994, 10946.420000000002, 16297.91, 3788.1000000000004, 27356.640000000007, 14024.480000000001, 29409.03], 'SUITS': [28587.990000000016, 14337.800000000001], 'BALLS': [25855.07, 15207.729999999992, 25567.809999999987, 8428.509999999998, 15119.609999999995, 26069.969999999983, 29843.490000000023], 'TOPS': [1673.2000000000005, 8673.400000000001, 23610.79999999999, 2090.380000000001], 'HEADWEAR': [2075.3000000000015, 18891.799999999996, 39717.93, 33657.65, 9965.720000000005, 12030.020000000006, 670.9999999999999, 12694.720000000007, 24846.22000000001, 1606.1799999999994, 9993.330000000002, 10154.900000000005], 'HARDWARE ACCESSORIES': [14619.109999999997], 'OTHER SHIRTS': [18013.450000000004], 'PROTECTION GEAR': [26454.929999999997], 'JERSEYS': [23741.06, 38425.269999999975], 'SANDALS/SLIPPERS': [9103.83, 21025.040000000005, 12702.349999999999, 26766.439999999984, 29818.339999999993], 'SHORTS': [14817.77, 29540.92999999998, 9415.059999999996, 14582.480000000001], 'JACKETS': [30096.11000000001, 13372.469999999998, 31145.73000000001, 6011.17, 12225.300000000003, 23485.399999999998, 13889.96], 'SWIMWEAR': [14035.140000000001, 20232.629999999997, 5142.340000000001, 2945.349999999998, 23495.320000000003, 8207.920000000004, 11972.729999999994], 'T-SHIRTS': [11130.700000000004, 8315.83, 8346.719999999998, 27847.550000000007, 22704.759999999995, 7828.200000000002, 17823.379999999997, 2248.46, 9012.14, 7774.72, 12030.049999999996, 4207.649999999999, 21293.16, 3159.4700000000007, 13385.12, 30507.87], 'UNDERWEAR': [10419.31, 31017.909999999993, 2794.590000000002, 18625.990000000005, 21829.879999999994], 'SWEATSHIRTS': [4317.6799999999985, 23453.049999999985, 28176.49000000001], 'TIGHTS': [23823.43999999999, 11180.129999999996], 'BAGS': [13980.240000000007, 18509.50999999999, 20064.309999999998, 22317.360000000004, 17641.04]}
i need this :
SHOES: 1519077.15 €
T-SHIRTS: 207615.78 €
HEADWEAR: 176304.77 €
BALLS: 146092.19 €
JACKETS: 130226.14 €
I have data stored in dict orderBygroup {key-list(of float values)} and need to take first 5 keys with max value.
My second question is - dict salesByCategory1 is make with loping to salesByCategory and sum of all values to receive the total for article number.
Can i get that totals with some smartes way ?
is there have easy way to make that output ?
totalByGroup1={}
for key,value in totalByGroup.items():
totalByGroup1[key]=sum(totalByGroup.get(key))
Create a new dictionary with summed elements. More resources.
sorted5=sorted(totalByGroup1, key=totalByGroup1.get, reverse=True)[:5]
print(sorted5)
sorting and taking the first 5 elements
output is : ['SHOES', 'T-SHIRTS', 'HEADWEAR', 'BALLS', 'JACKETS']
more time, more resurses
for key in sorted5:
print(key,': ','{0:.2f}'.format(totalByGroup1.get(key)))
and now result :
SHOES : 1519077.15
T-SHIRTS : 207615.78
HEADWEAR : 176304.77
BALLS : 146092.19
JACKETS : 130226.14
now lets ask again if we have 4 record in dict wit that data:
a:[1,2,3],b:[6,7,8],c:[4,5,6],d:[9,10,11]
how to get first 2 key,value sorted by max value -->>
d:30,b:21
if we have 1000 record in dict - ?? how to get first N key sorted by max value of list
example go:1563,do:1560,bo:1490,ro:1480 .. etc

Why Python doesn't iterate over repeated list into one list

Right now I'm working on Python 2.7 and I have a little issue.
I explain I need to get the index of a list that is into another list:
students=[["A","B"],["A","B"]]
for m in students:
if "A" in m and "B" in m:
print m
When I run this code I got this:
['A', 'B']
['A', 'B']
It seems to be right, it iterates over students and print twice ['A', 'B'] because it's repeated...but if I run this code:
for m in students:
if "A" in m and "B" in m:
print students.index(m)
it prints this:
0
0
It seems that it only iterates over the first element, for me the correct output should be like this:
0
1
Could anyone explain me why Python do that, and how to fix it, Thank you
students.index(m) returns the first index, i, where students[i] equals m.
Since students contains the same item twice, 0 is returned both times.
So the loop is iterating over both items in students, but since student[0] == student[1], when m is bound to students[1], students.index(student[1])) still returns 0.
If you simply want to report the current index of the loop, then use enumerate:
students = [["A","B"],["A","B"]]
for i, m in enumerate(students):
if "A" in m and "B" in m:
print i
prints
0
1

Split if two consecutive characters are not same

I have a input string like
a = '4433555555666666'
i want the values to be separated if last character is not same as the next one.
in this case:
44, 33, 555555, 666666
I'm new in python so don't know how to deal with it. I have tried but it just gives first one correct i.e.
['44', '', '555555666666']
Also if two consecutive character group is same.
i.e.
a = 'chchdfch'
then 'ch' should be replaced with
a = '**df*'
You can use itertools.groupby()
[''.join(v) for k, v in itertools.groupby(a)]
Demo:
>>> import itertools
>>> a = '4433555555666666'
>>> [''.join(value) for key, value in itertools.groupby(a)]
['44', '33', '555555', '666666']
So this code is called a list comprehension - a compact way of iterating over elements individually.
Another way of representing this is:
>>> for k, v in itertools.groupby(a):
... print k, v
...
4 <itertools._grouper object at 0x100b90710>
3 <itertools._grouper object at 0x100b90750>
5 <itertools._grouper object at 0x100b90710>
6 <itertools._grouper object at 0x100b90750>
>>> for k, v in itertools.groupby(a):
... print k, "".join(v)
...
4 44
3 33
5 555555
6 666666
>>>
Just ignore the k the iterator generates.