getarray.py 5.6 KB

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