我正在处理一些数据,这些数据的每条记录都有不断变化的键。我已经从每条记录中收集了一个主键列表,并将它们存储在列表中。然后,我想遍历列表以使用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
我使这个难度变得比需要的难吗?最大的问题是密钥可以在记录之间变化,并且在某些情况下,数据中存在嵌套的密钥。
答案 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)
这将处理所有键,但是如果嵌套字典的层次超过两个级别,则可能需要将其重新实现为递归函数。