使用列表中的值遍历字典

时间:2018-12-09 19:39:46

标签: python

我正在处理一些数据,这些数据的每条记录都有不断变化的键。我已经从每条记录中收集了一个主键列表,并将它们存储在列表中。然后,我想遍历列表以使用static void exec_pipe(size_t pos, int in_fd) { // Invalid Pipe has issues if (newargv[pipe_commands[pos+1]] == NULL) { report_error_and_exit("Invalid pipe"); } if (pipe_commands[pos + 1] == 0) { /* last command */ redirect(in_fd, STDOUT_FILENO); /* read from in_fd, write to STDOUT */ execvp(newargv[pipe_commands[PIPE_FLAG-pos]], newargv + pipe_commands[PIPE_FLAG-pos]); report_error_and_exit("execvp last command"); } else { /* $ <in_fd cmds[pos] >fd[1] | <fd[0] cmds[pos+1] ... */ int fd[2]; /* output pipe */ if (pipe(fd) == -1) report_error_and_exit("pipe"); switch(fork()) { case -1: report_error_and_exit("fork"); case 0: /* child: execute the rest of the commands */ CHK(close(fd[0])); /* unused */ CHK(close(in_fd)); /* unused */ exec_pipe(pos + 1, fd[1]); /* execute the rest */ default: /* parent: execute current command `cmds[pos]` */ child = 1; CHK(close(fd[1])); /* unused */ redirect(in_fd, STDOUT_FILENO); /* read from in_fd */ redirect(fd[0], STDIN_FILENO); /* write to fd[0] */ execvp(newargv[pipe_commands[PIPE_FLAG-pos]], newargv + pipe_commands[PIPE_FLAG-pos]); report_error_and_exit("execvp"); } } } void pipeHelper() { pid_t dad; (void) fflush(stdin); (void) fflush(stdout); // Check for successful fork if ((dad = fork()) < 0) report_error_and_exit("fork"); else if (dad == 0) { // Catch input redirect // Copy input file description to standard in descriptor then close if (IN_FLAG == 1) redirect(input_file_description, STDIN_FILENO); // Catch output redirect // Copy output file description to standard out descriptor then close if (OUT_FLAG == 1) redirect(output_file_description, STDOUT_FILENO); // Catch input redirect if (HEREIS_FLAG > 0 && BAIL_FLAG == 0) redirect(hereis_file_description, STDIN_FILENO); // Redirect to /dev/null if (AMP_FLAG != 0 && IN_FLAG == 0) redirect(devnull_file_description, STDIN_FILENO); exec_pipe(0, STDIN_FILENO); //exec_pipeline(0, STDIN_FILENO); } else { if (AMP_FLAG != 0) { (void) printf("%s [%d]\n", newargv[0], dad); AMP_FLAG = 0; } else { for (;;) { pid_t pid; pid = wait(NULL); if (pid == dad) break; } } } } 拉取适当的值,但是由于列表项中的项为try catch而字典为{ {1}}。

例如,请注意嵌套键的可能性。否则我的方法会更简单:

str

我使这个难度变得比需要的难吗?最大的问题是密钥可以在记录之间变化,并且在某些情况下,数据中存在嵌套的密钥。

1 个答案:

答案 0 :(得分:1)

首先,如果您按照以下步骤进行操作,则可以使以上代码段起作用

records = # ...
keys = [ ('id',), ('name',), ('campaign',), ('campaign', 'id'), ('campaign', 'name'), ('last_updated',) ]

for record in records:
    for key_tuple in keys:
        obj = record
        for key in key_tuple:
            obj = record[key]
        print(obj)

您的代码段中的一个问题是出现了['campaign']['id']之类的元素。 Python假设['campaign']部分是文字列表定义,然后['id']为该列表建立索引(但不能,因为它不是整数)。

更笼统地说,我建议考虑使用.items()方法来查找字典。您可以将以上代码片段转换为

for record in records:
    for key, value in record.items():

        # to handle nested dictionaries
        if isinstance(value, dict):
            for subkey, subval in value.items():
                print(subkey, subval)
        else:
            print(key, val)

这将处理所有键,但是如果嵌套字典的层次超过两个级别,则可能需要将其重新实现为递归函数。