使用列表与使用函数创建的列表

2024-10-03 17:16:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我为下面的列表"mylist"创建了"foundkeys"函数来搜索另一个列表"keys"项的出现,输出看起来像"formatted_list"现在我将"foundkeys"的输出传递给"reorder"函数,该函数将传递的"order"示例"foundkeys"的内容重新排序为特定格式

问题 如果我使用上面的设置,我不会得到所需的确切输出,但是如果我将"foundkeys"的确切输出“formatted_list”传递给"reorder",而不是调用"foundkeys",我会得到所需的格式

正确的输出应如下所示: “a”键的元素以“a”开头,“k”键的元素以“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']]]]

但是如果我使用设置,我会得到这个错误的输出: 在“a”键的元素中放置“k”而不是“a”

[['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)

Tags: inforvalueorderkeysitemreorderlist
1条回答
网友
1楼 · 发布于 2024-10-03 17:16:02

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)]没有在b中插入三个“单独的”a。它实际上将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

相关问题 更多 >