2017-05-29 41 views
0

我有以下列表"mylist"为我创造了"foundkeys"功能来搜索它的另一个列表"keys"项目发生,输出会像"formatted_list"现在我通过的"foundkeys"输出到"reorder"函数,其将"order"例子"foundkeys"的内容重新排序成特定格式。与列表VS由函数创建一个列表工作

问题 如果我用上面的设置我没有得到所需的准确输出,但如果我通过“‘FORMATTED_LIST’”“这是"foundkeys"确切的输出”,以"reorder"而不是调用"foundkeys" ,我会得到所需要的格式

正确的输出应该是这样的: 用“a”键有其开始与“A”并且其以“K”

[['a', [[1, 'a', 'Asfoor', 'b', 'c'], 
     [2, 'a', 'j', 'deek', 'k'], 
     [3, 'a', 'k', 'bata', 'p']]], 
['k', [[2, 'k', 'j', 'a', 'deek'], 
     [3, 'k', 'bata', 'a', 'p'], 
     [4, 'k', 'v', 'm', 'farkha']]]] 
元素“K”关键要素

,但如果我使用的设置我得到这个错误输出: 它“A”中的元素把“K”,而不是“一”键

[['a', [[1, 'a', 'Asfoor', 'b', 'c'], 
     [2, 'k', 'j', 'deek', 'a'], 
     [3, 'k', 'a', 'bata', 'p']]], 
['k', [[2, 'k', 'j', 'deek', 'a'], 
     [3, 'k', 'a', 'bata', 'p'], 
     [4, 'k', 'v', 'm', 'farkha']]]] 

好心看看到的代码更好的理解。

mylist= 
    [[1, 'Asfoor', 'a', 'b', 'c'], 
    [2, 'deek', 'j', 'a', 'k'], 
    [3, 'bata', 'k', 'a', 'p'], 
    [4,'farkha','v','m','k']] 

keys = ['a', 'k'] 

def foundkeys(mylist,keys): 
    def found(list, k): 
     return k in list 
    final = [] 
    for j in keys: 
     final.append([j , [k for k in mylist if found(k, j)]]) 

    return final; 
order=foundkeys(mylist,keys) 
print("New list with found keys \n",order)  

formatted_list= 
    [ 
     [ 
      'a', [[1, 'Asfoor', 'a', 'b', 'c'], [2, 'deek', 'j', 'a', 'k'], [3, 'bata', 'k', 'a', 'p'] 
     ]], 
     [ 
      'k', [[2, 'deek', 'j', 'a', 'k'], [3, 'bata', 'k', 'a', 'p'], [4, 'farkha', 'v', 'm', 'k']] 
     ] 
    ] 

def reorder(alist): 

    for item in alist: 
     key=item[0] 
     value=item[1] 
     for c,v_item in enumerate(value): 
      old=value[c][1] 
      for i,s_value in enumerate(value[c]): 
       if s_value==key: 
       value[c][i]=old 
       value[c][1]=key 

# calling reorder function with order function list 
reorder(order) 
print(order) 
# calling reorder function with formatted_list instead 
reorder(formatted_list) 
print(formatted_list) 

回答

1

Python使用引用来存储列表。要查看此信息,请尝试运行以下代码。

a = [1, 2] 
b = [a for i in range(0, 3)] 
print(b) # prints out [[1, 2], [1, 2], [1, 2]] 

b[0][0] = 4 
print(b) # prints out [[4, 2], [4, 2], [4, 2]] 

[a for i in range(0, 3)]不插入三个 “个人” ab。它实际上插入a的参考b。因此,当我们通过b[0][0]更改元素时,我们使用相同的参考来更改所有列表。

要解决这个问题,只需要python创建一个新列表,而不仅仅是复制引用。

a = [1, 2] 
b = [list(a) for i in range(0, 3)] # This line is different 
print(b) # prints out [[1, 2], [1, 2], [1, 2]] 

b[0][0] = 4 
print(b) # prints out [[4, 2], [1, 2], [1, 2]] 

因此,在你的代码,它应该是

for j in keys: 
    final.append([j , [list(k) for k in mylist if found(k, j)]]) 

而现在你会得到使用orderformatted_list相同的结果。

你可以看到this post了解更多关于参考和副本的理解。

+0

非常感谢你,它现在完美。 –