交换包含字典列表的字典中的值?

2024-06-16 14:30:04 发布

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

我有一本字典,里面有如下的字典清单。你知道吗

我想根据名称交换字典列表的所有值。你知道吗

示例:swap_function('Arvind','Jayesh')应交换其他值,如姓氏、全名和电子邮件。你知道吗

我已经尝试了很多从其他网站的参考,但不能达到我的目标。你知道吗

data = {
   "items":[
      {                 
         "name":"Arvind",
         "surname":"Patel",
         "fullname":"Arvind Patel",
         "email":"abc@xyx.com"        
      },
      {        
         "name":"Jayesh",
         "surname":"Patel",
         "fullname":"Jayesh Patel",
         "email":"Patel@gmail.com"
      },
      {        
         "name":"Krishna",
         "surname":"dave",
         "fullname":"Krishna dave",
         "email":"Krishna@xyz.com"
      },
      {        
         "name":"Aditya",
         "surname":"Patel",
         "fullname":"Aditya Patel",
         "email":"Aditya@abc.com"
      }

   ]
}

我试过下面这样,但之后我就没有主意了。你知道吗

def name_swap(name1, name2):

   for key, item in data.items():
      first_dict = item[0]
      second_dict = item[1]
      third_dict = item[2]
      forth_dict = item[3]
      fifth_dict = item[4]
after name_swap('Arvind', 'Krishna')

output : 
data = {
   "items":[
      {                 
         "name":"Arvind",
         "surname":"dave",
         "fullname":"Krishna dave",
         "email":"Krishna@xyz.com"        
      },
      {        
         "name":"Jayesh",
         "surname":"Patel",
         "fullname":"Jayesh Patel",
         "email":"Patel@gmail.com"
      },
      {        
         "name":"Krishna",
         "surname":"Patel",
         "fullname":"Arvind Patel",
         "email":"abc@xyx.com"
      },
      {        
         "name":"Aditya",
         "surname":"Patel",
         "fullname":"Aditya Patel",
         "email":"Aditya@abc.com"
      }

   ]
}

Tags: namecom字典emailsurnameitemdictabc
3条回答

如果我没说错的话:

首先要找到两个dict的索引:

Find the index of a dict within a list, by matching the dict's value

然后切换项目的位置:

How to switch position of two items in a Python list?

def switch(list,name1, name2):
     index1 = next((index for (index, d) in enumerate(list) if d["name"] == name1), None)
     index2 = next((index for (index, d) in enumerate(list) if d["name"] == name2), None)
     list[index1]['name'], list[index2]['name'] = list[index2]['name'], list[index1]['name']
     return list

data['items'] = switch(data['items'], 'Arvind', 'Krishna')

请尝试以下代码:

i = next(i for i,item in enumerate(data['items']) if item['name'] == 'Arvind')
j = next(i for i,item in enumerate(data['items']) if item['name'] == 'Krishna')
data['items'][i]['name'], data['items'][j]['name'] = 'Krishna', 'Arvind'

并给出:

{'items': [{'name': 'Arvind',
   'surname': 'dave',
   'fullname': 'Krishna dave',
   'email': 'Krishna@xyz.com'},
  {'name': 'Jayesh',
   'surname': 'Patel',
   'fullname': 'Jayesh Patel',
   'email': 'Patel@gmail.com'},
  {'name': 'Krishna',
   'surname': 'Patel',
   'fullname': 'Arvind Patel',
   'email': 'abc@xyx.com'},
  {'name': 'Aditya',
   'surname': 'Patel',
   'fullname': 'Aditya Patel',
   'email': 'Aditya@abc.com'}]}

现在让我们用下面的函数来概括这个例子:

def swap_dict_list(dict_list, val1, val2, target='name', block_target=True):   
    try:
        i = next(i for i,item in enumerate(dict_list) if item[target] == val1)
        j = next(i for i,item in enumerate(dict_list) if item[target] == val2)
    except StopIteration:
        return dict_list
    dict_list[i], dict_list[j] = dict_list[j], dict_list[i]
    if block_target:
        dict_list[i][target], dict_list[j][target] = val1, val2
    return dict_list

在您的情况下,您将使用以下函数:

data['items'] = swap_dict_list(data['items'], 'Arvind', 'Krishna', target='name', block_target=True)

你会得到和上面一样的结果。你知道吗

代码解释

swap_dict_list函数接收字典列表'dict\u list'、要搜索的2个值('val1'和'val2')和要执行target搜索的字典键作为输入。你知道吗

该函数查找与所搜索的两个值对应的索引,如果它们都存在,则执行交换。如果block_targetTrue,则不交换目标值。你知道吗

使用generator expression可以有效地进行搜索。你知道吗

试试这个:

def switch(list, name1, name2):
    for item in list:
        if item['name'] == name1:
            item['name'] = name2
        elif item['name'] == name1:
            item['name'] = name2

    return list


data = {
   "items":[
      {
         "name":"Arvind",
         "surname":"Patel",
         "fullname":"Arvind Patel",
         "email":"abc@xyx.com"
      },
      {
         "name":"Jayesh",
         "surname":"Patel",
         "fullname":"Jayesh Patel",
         "email":"Patel@gmail.com"
      },
      {
         "name":"Krishna",
         "surname":"dave",
         "fullname":"Krishna dave",
         "email":"Krishna@xyz.com"
      },
      {
         "name":"Aditya",
         "surname":"Patel",
         "fullname":"Aditya Patel",
         "email":"Aditya@abc.com"
      }

   ]
}

data['items'] = switch(data['items'], 'Arvind', 'Jayesh')

print data

相关问题 更多 >