getarray.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import math
  2. from utils import conf
  3. #获取阶乘列表
  4. def jieChen(n):
  5. myArray = {};
  6. myArray[0] = 1;
  7. i = 1;
  8. while i<n :
  9. myArray[i] = (i+1)*myArray[i-1];
  10. i = i+1
  11. return myArray;
  12. #获取阶乘排列数组
  13. def jiechenarray(n):
  14. array = [];
  15. if n < 1:
  16. return array
  17. if n == 1:
  18. onearray = [];
  19. onearray.append(n)
  20. array.append(onearray)
  21. return array
  22. subArray = jiechenarray(n-1);
  23. subArrayLength = len(subArray)
  24. for item in range(subArrayLength):
  25. for index in range(len(subArray)+1):
  26. newArrayItem = subArray[item].copy()
  27. newArrayItem.insert(index,n)
  28. array.append(newArrayItem)
  29. return array
  30. #获取指定数的阶乘
  31. def jieChenNumber(n):
  32. if(n <= 1):
  33. return 1;
  34. return jieChen(n)[n-1];
  35. #辗转相除法进行进制转化
  36. def changeInt2Str(i,m):
  37. if(not isinstance(m,int)):
  38. conf.myprint("m is not int",m)
  39. return
  40. if(m*i == 0):
  41. return "0";
  42. result = "";i
  43. myarray = {};
  44. while(i>=m):
  45. myarray[myarray.__len__()] = i%m
  46. i=int(i/m)
  47. if(i!=0):
  48. myarray[myarray.__len__()] = i
  49. for item in myarray :
  50. result=str(myarray[item])+result
  51. return result
  52. #获取组合数位置列表
  53. def getAllPosition(m, n):
  54. allArray = {}
  55. max = math.pow(m,n)
  56. index = 0;
  57. while (index < max):
  58. itemIndex = changeInt2Str(index,m)
  59. while(itemIndex.__len__()<n):
  60. itemIndex = "0"+itemIndex
  61. allArray[index]=itemIndex
  62. index = index+1
  63. conf.myprint(allArray)
  64. return allArray
  65. #获取组合数列表的排列总数
  66. def getAllArrayNumber(m,n):
  67. total = 0
  68. allArray = getAllPosition(m, n)
  69. for item in allArray:
  70. total = getitemIndexArrayNumber(allArray[item],m,n)+total
  71. conf.myprint("total=",total)
  72. return total
  73. #获取单个组合的各边重复项
  74. def getitemIndexArray(itemIndex,m,n):
  75. a = {};
  76. for item in range(m):
  77. index = 0;
  78. indexNum = 0;
  79. while(index < n):
  80. if(itemIndex[index] == str(item)):
  81. indexNum = indexNum + 1
  82. index = index+1
  83. a[item]=indexNum
  84. conf.myprint("a=",a)
  85. return a
  86. #获取单个组合的各边重复项及其位置
  87. def getitemIndexArrayAndIndex(itemIndex,m,n):
  88. a = {};
  89. for item in range(m):
  90. index = 0;
  91. indexList = [];
  92. while(index < n):
  93. if(itemIndex[index] == str(item)):
  94. indexList.append(index)
  95. index = index+1
  96. a[item]=indexList
  97. conf.myprint("a=",a)
  98. return a
  99. #如[0, 1, 3]转成6个位置[0,1,3],[0,3,1],[1,0,3],[1,3,0],[3,0,1],[3,1,0]
  100. def getPositionArray(positions):
  101. newPositons = []
  102. jiechen_array = jiechenarray(len(positions))
  103. for item in jiechen_array:
  104. m_position = []
  105. for item_item in item:
  106. m_position.append(positions[item_item-1])
  107. newPositons.append(m_position)
  108. return newPositons
  109. #获取单个组合的各边重复项及重复项顺序
  110. def getitemIndexArrayAndPosition(itemIndex,m,n):
  111. a = getitemIndexArray(itemIndex,m,n)
  112. for item in a:
  113. if(a[item] > 1):
  114. newItem = {}
  115. newItem[0] = a[item]
  116. newItem[1] = jiechenarray(a[item])
  117. a[item] = newItem
  118. conf.myprint("getitemIndexArrayAndPosition=",a)
  119. return a
  120. #获取模板的插入顺序,必定大于1个
  121. def getModuleIndex(itemIndex,m,n):
  122. indexArrayAndIndex = getitemIndexArrayAndIndex(itemIndex,m,n)
  123. positions=[]
  124. for item in indexArrayAndIndex:
  125. item1 = indexArrayAndIndex[item]
  126. if(len(item1)>0):
  127. position_array = getPositionArray(item1)
  128. if(len(positions) == 0):
  129. positions= position_array
  130. else:
  131. temp_positions=[]
  132. for temp_item in positions:
  133. for this_temp_item in position_array:
  134. new_temp_item = temp_item.copy()
  135. for item1_item in item1:
  136. item1_item_index=item1.index(item1_item)
  137. new_temp_item.insert(this_temp_item[item1_item_index],item1_item)
  138. temp_positions.append(new_temp_item)
  139. positions=temp_positions
  140. return positions
  141. #获取单个组合的各边重复项--包含各项位置
  142. # 如{0: {0: 0, 1: {}}, 1: {0: 0, 1: {}}, 2: {0: 2, 1: {0: 0, 1: 4}}, 3: {0: 3, 1: {0: 1, 1: 2, 2: 3}}, 4: {0: 0, 1: {}}}
  143. def getitemIndexAndPositionArray(itemIndex, m, n):
  144. a = {};
  145. for item in range(m):
  146. index = 0;
  147. indexNum = 0;
  148. positions = {};
  149. while(index < n):
  150. if(itemIndex[index] == str(item)):
  151. positions[len(positions)] = index
  152. indexNum = indexNum + 1
  153. index = index+1
  154. aItem = {}
  155. aItem[0] = indexNum
  156. aItem[1]=positions
  157. a[item]=aItem
  158. conf.myprint("a=",a)
  159. return a
  160. #获取单个组合的各边重复项的排列数
  161. def getitemIndexArrayNumber(itemIndex,m,n):
  162. itemIndexArrayNumber = 1;
  163. a = getitemIndexArray(itemIndex,m,n)
  164. for item in a:
  165. intItem = int(a[item])
  166. if(intItem > 1):
  167. itemIndexArrayNumber = jieChenNumber(intItem)*itemIndexArrayNumber
  168. if(itemIndexArrayNumber == 0):
  169. itemIndexArrayNumber = 1
  170. return itemIndexArrayNumber
  171. # result = changeInt2Str(14,3);
  172. # conf.myprint(result)
  173. # getAllPosition(3, 3)
  174. # getAllArrayNumber(4,8)
  175. # getitemIndexArray("11213",5,5)
  176. # getitemIndexArrayAndIndex("11213",5,5)
  177. # conf.myprint(getModuleIndex("11212",5,5))
  178. # getitemIndexArrayAndPosition("11213",5,5)
  179. # getitemIndexAndPositionArray("113", 4, 3)
  180. # number = getitemIndexArrayNumber("11143",5,5)
  181. # conf.myprint(number)
  182. # getAllArrayNumber(11,2)
  183. # conf.myprint(jiechenarray(3))
  184. # conf.myprint(getPositionArray([0,3,4]))