在列表列表的列表中,如何比较具有相同字母表的列表列表并将值附加到新列表中?

时间:2017-10-06 02:15:17

标签: python list

我有两个列表清单:

A=[[[0, 'a'], [2, 'g'], [9, 'Q']], [[2, 'a'], [0, 'c'], [0, 'g'], [15, 'w'], [2, 'Q']], [[15, 'g'], [0, 'w'], [7, 'Q']], [[9, 'a'], [0, 'c'], [2, 'g'], [7, 'w'], [0, 'Q']]]
B[[[0, 'a'], [0, 'Q'], [12, 'front'], [0, 'Z']], [[1, 'a'], [2, 'c'], [0, 'w'], [0, 'Q'], [2, 'front'], [0, 'Z']], [[0, 'Q'], [3, 'front'], [5, 'Z']], [[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'front'], [2, 'Z']], [[0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q'], [2, 'front'], [0, 'Z']]]

对于其中的每个列表列表,我想比较字母表。如果字母表是共同的,则将具有最高值编号的列表附加到新列表中。如果字母表不相同,则只需附加。

输出应该是:

 C=[[[0, 'a'],[2,'g'], [9, 'Q'], [12, 'front'], [0, 'Z']], [[1, 'a'],[[0,'g'], [2, 'c'], [0, 'w'], [0, 'Q'], [2, 'front'], [0, 'Z']],....

3 个答案:

答案 0 :(得分:0)

正确解决此问题需要大量缺失的细节。

例如,

  • 当列表2中的字母较高时,您以哪种顺序附加项目?
  • 那有关系吗?
  • 您是只是想解决这个案例,还是需要一个解决方案? 适用于任何3D列表吗?
  • “如果字母不相同,只需附加”...怎么样?

无论如何,希望这能指出你正确的方向。绝对没有优化,我敢肯定有一个更简单和优雅的递归方式来解决这个问题。但是这个想法是打破它,所以你要比较正确的元素,然后做任何必要的列表追加。

a = [[[0, 'a'], [2, 'g'], [9, 'Q']], [[0, 'c'], [0, 'g'], [0, 'Q']], [[2, 'a'], [0, 'c'], [0, 'g'], [15, 'w'], [2, 'Q']], [[15, 'g'], [0, 'w'], [7, 'Q']], [[9, 'a'], [0, 'c'], [2, 'g'], [7, 'w'], [0, 'Q']]]

b = [[[0, 'a'], [0, 'Q'], [12, 'front'], [0, 'Z']], [[1, 'a'], [2, 'c'], [0, 'w'], [0, 'Q'], [2, 'front'], [0, 'Z']], [[0, 'Q'], [3, 'front'], [5, 'Z']], [[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'front'], [2, 'Z']], [[0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q'], [2, 'front'], [0, 'Z']]]

group_a = {}
group_b = {}

count = 0
for x in a:
  group_a[count] = []
  for y in x:
    group_a[count].append(y)
  count+=1

count = 0
for x in b:
  group_b[count] = []
  for y in x:
    group_b[count].append(y)
  count+=1


new_list = []

for x in range(len(group_b)):
  first = group_a[x]
  second = group_b[x]
  for y in first:
    for z in second:
      if y[1] == z[1]:
        if y[0] > z[0]:
          break
        else:
          y[0] = z[0]

  for y in second:
    add = True
    for z in first:
      if y[1] == z[1]:
        add = False
    if add:
      first.append(y)

  new_list.append(first)

print(new_list)

希望这有助于您找到适用于所有3D列表的漂亮递归解决方案,而不仅仅是您在上面提供的两个!

....当然还有DRY(与我的不同)在你提出的更好的解决方案中。

答案 1 :(得分:0)

忽略输出嵌套列表元素的顺序并假设输入列表的长度相等:

A=[[[0, 'a'], [2, 'g'], [9, 'Q']], [[0, 'c'], [0, 'g'], [0, 'Q']], [[2, 'a'], [0, 'c'], [0, 'g'], [15, 'w'], [2, 'Q']], [[15, 'g'], [0, 'w'], [7, 'Q']], [[9, 'a'], [0, 'c'], [2, 'g'], [7, 'w'], [0, 'Q']]]
B=[[[0, 'a'], [0, 'Q'], [12, 'front'], [0, 'Z']], [[1, 'a'], [2, 'c'], [0, 'w'], [0, 'Q'], [2, 'front'], [0, 'Z']], [[0, 'Q'], [3, 'front'], [5, 'Z']], [[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'front'], [2, 'Z']], [[0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q'], [2, 'front'], [0, 'Z']]]   

C=[]
for index in range(len(A)):
    list_a = A[index]
    list_b = B[index]
    if len(list_a) > len(list_b):
        loop_list=list_a
        comp_list=list_b
    else:
        loop_list=list_b
        comp_list=list_a        
    temp=[]
    found_list=[]
    for each_sub_list in loop_list:
            number = each_sub_list[0]
            alphabet = each_sub_list[1]
            found=0
            for index_b,each_sub_list_b in enumerate(comp_list):
                if alphabet == each_sub_list_b[1]:
                    found=index_b
                    found_list.append(comp_list[index_b])
                    break
            if found:
                if number > comp_list[found][0]:
                    temp.append(each_sub_list)
                else:
                    temp.append(comp_list[found])
            else:
                temp.append(each_sub_list)
    never_found_list = [item for item in comp_list if item not in found_list]
    temp.extend(never_found_list)
    C.append(temp)
print(C)            

答案 2 :(得分:0)

使用itertools.izip_longest处理不同的输入列表长度,如果您使用的是python 3,请使用itertools.zip_longest

tmp持有两个列表中的zip项目

然后,按照索引1对列表进行排序,然后按索引0键反向排序,带alphabat的项目按值从高到低依次组合在一起。

然后,我们只取第一个最高值项并忽略较低值项

A=[[[0, 'a'], [2, 'g'], [9, 'Q']], [[2, 'a'], [0, 'c'], [0, 'g'], [15, 'w'], [2, 'Q']], [[15, 'g'], [0, 'w'], [7, 'Q']], [[9, 'a'], [0, 'c'], [2, 'g'], [7, 'w'], [0, 'Q']]]
B=[[[0, 'a'], [0, 'Q'], [12, 'front'], [0, 'Z']], [[1, 'a'], [2, 'c'], [0, 'w'], [0, 'Q'], [2, 'front'], [0, 'Z']], [[0, 'Q'], [3, 'front'], [5, 'Z']], [[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'front'], [2, 'Z']], [[0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q'], [2, 'front'], [0, 'Z']]]

C = []
for a,b in itertools.izip_longest(A,B):
  tmp = []
  mem = set()
  if a:
    tmp.extend(a)  
  if b:
    tmp.extend(b)
  sorted_list = sorted(tmp, key=lambda x:(x[1],x[0]), reverse=True)
  inner_out = []
  for i in sorted_list:
    if i[1] not in mem:
      inner_out.append(i)
    mem.add(i[1])
  C.append(inner_out)

# C = [[[2, 'g'], [12, 'front'], [0, 'a'], [0, 'Z'], [9, 'Q']], [[15, 'w'], [0, 'g'], [2, 'front'], [2, 'c'], [2, 'a'], [0, 'Z'], [2, 'Q']], [[0, 'w'], [15, 'g'], [3, 'front'], [5, 'Z'], [7, 'Q']], [[7, 'w'], [2, 'g'], [0, 'front'], [0, 'c'], [12, 'a'], [2, 'Z'], [3, 'Q']], [[0, 'w'], [2, 'front'], [0, 'c'], [0, 'a'], [0, 'Z'], [5, 'Q']]]