import sys
from collections import defaultdict
from functools import reduce
def load_txt(fname):
list2 = []
with open(fname,'r') as f:
list2 = [tuple(map(int,line.split(','))) for line in f]
return list2
def flatmap(lista, f):
return flatten(colection_map(lista,f))
def flatten(list_of_lists):
flattened_list = [item for sublist in list_of_lists for item in sublist]
return flattened_list
def colection_map(lista, f):
return list(map(f, lista))
def reduceByKey(kolekcja, f):
result_dict = {}
result = []
for key, value in kolekcja:
if key in result_dict:
result_dict[key]=f(result_dict[key], value)
else:
result_dict[key] = value
for key, value in result_dict.items():
result.append((key,value))
return result
def crossJoinByKey(m1,m2):
list1 = []
for k1 in m1:
for k2 in m2:
if k1[0] == k2[0]:
list1.append((k1[0],(k1[1],k2[1])))
return list1
list1 = load_txt(sys.argv[1])
#print(list1)
fA = lambda p: ((p[0],p[1]),(p[1],p[0]))
fP1 = lambda p: (p[0],0)
fR = lambda a,b: a+b
fP2 = lambda p: p[0]
fPe = lambda p: (p,p,True)
fT = lambda t: (t[1][1],(t[0],t[1][0]))
fS1 = lambda a,b: (a[0],min(a[1],b[1]))
fS2 = lambda t: (t[0],min(t[1][0],t[1][1]))
fS3 = lambda s: (s[0],(s[0],s[1]))
fZ1 = lambda p: p[2]
fZ2 = lambda p,q: p or q
fW1 = lambda w: (w[1][1],(w[0],(w[1][0],w[1][1])))
fW2 = lambda w: (w[1])
fW3 = lambda w: (w[0][0],w[1])
fPe2 =lambda s: (s[0],min(s[1][0],s[1][1]),s[1][1] < s[1][0])
listA = flatmap(list1, fA)
#print(listA)
listP = colection_map(reduceByKey(colection_map(listA, fP1),fR),fP2)
#print(listP)
listPe = colection_map(listP,fPe)
#print(listPe)
listT = crossJoinByKey(listPe,listA)
#print(listT)
listS = colection_map(colection_map(reduceByKey(listT,fS1),fS2),fS3)
#print("list S: ",listS)
z = reduce(fZ2,colection_map(listPe,fZ1))
#print(z)
while z:
#print("--------------------------------------------")
listW1 = colection_map(listS,fW1)
#print("list W1: ", listW1)
listW2 = colection_map(crossJoinByKey(listW1,listS),fW2)
#print("list W2: ",listW2)
listS = colection_map(listW2,fW3)
#print("list S: ",listS)
listPe = colection_map(listS, fPe2)
z = reduce(fZ2,colection_map(listPe,fZ1))
if z == False:
listZ = crossJoinByKey(listS,listA)
print(listZ)
#print("list S: ",listS)