Python 从高级自定义字段查询添加到列表
Python Add to List From Advanced Custom Fields Query
我正在尝试查询在使用高级自定义字段转发器的 Wordpress 站点中创建的一些选项,并从中创建一个 python 列表。
我的查询很好,但它是 returns 典型的 ACF“选项”转发器数据,它没有存储为序列化数组,而是每个字段都是一个单独的记录,如下所示:
option_name option_value
options_updates_notifier_contact_list_0_un_c_email kpirnie@example.com
options_updates_notifier_contact_list_0_un_c_name Kevin
options_updates_notifier_contact_list_1_un_c_email kpirnie+hub@example.com
options_updates_notifier_contact_list_1_un_c_name Kevin 2
options_updates_notifier_contact_list_2_un_c_email kpirnie+thehub@example.com
options_updates_notifier_contact_list_2_un_c_name Kevin 3
我的代码对此进行循环,并根据一些正则表达式收集所需的元素
# setup the regular expression to use
_re = r"options_updates_notifier_contact_list_(\d+)_un_c_(\w+)"
# hold our returnable list _ret = []
# if there are records
if _rs is not None:
# loop them
for _r in _rs:
# hold the field
_field = _r[0]
# hold the value
_value = _r[1]
# hold the RE match
_match = re.search( _re, _field )
# the index
_idx = int( _match.group( 1 ) )
# the name
_the_name = _match.group( 2 )
# insert at the set index
_ret.insert( _idx, [ _idx, _the_name, _value ] )
# this returns a IndexError: list index out of range
#_ret[ int( _match.group( 1 ) ) ].extend( [ _match.group( 2 ), _value ] )
print( _ret )
其中returns我以下列表:
[[0, 'name', 'Kevin'], [1, 'name', 'Kevin 2'], [2, 'name', 'Kevin 3'], [2, 'email', 'kpirnie+thehub@example.com'], [1, 'email', 'kpirnie+hub@example.com'], [0, 'email', 'kpirnie@example.com']]
我的目标是像这样返回列表:
[
[[0, 'name', 'Kevin'], [0, 'email', 'kpirnie@example.com']],
[[1, 'name', 'Kevin 2'], [1, 'email', 'kpirnie+hub@example.com']],
[[2, 'name', 'Kevin 3'], [2, 'email', 'kpirnie+thehub@example.com']]
]
其中每个名称|电子邮件组合都是它自己的列表项。我该怎么做?
如果您从当前结果开始,您可以像这样对数据进行排序、配对和验证:
data = [
[0, 'name', 'Kevin'],
[1, 'name', 'Kevin 2'],
[2, 'name', 'Kevin 3'],
[2, 'email', 'kpirnie+thehub@example.com'],
[1, 'email', 'kpirnie+hub@example.com'],
[0, 'email', 'kpirnie@example.com']
]
# Sorting
data = sorted(data, key=lambda item: item[0])
# Pairing
it = iter(data)
data = [list(item) for item in zip(it, it)]
# Validation
assert(all(el[0] == item[0][0] for item in data for el in item))
这是假设每个索引值有 2 条记录。如果不满足此条件,验证将不会通过并引发异常。
如果具有相似索引的记录数未知或可能不同,您可以将数据存储在临时字典中,然后提取值:
from collections import defaultdict
# setup the regular expression to use
_re = r"options_updates_notifier_contact_list_(\d+)_un_c_(\w+)"
# hold our returnable list
_ret = []
_tmp_dict = defaultdict(list)
# if there are records
if _rs is not None:
# loop them
for _r in _rs:
# hold the field
_field = _r[0]
# hold the value
_value = _r[1]
# hold the RE match
_match = re.search(_re, _field)
# the index
_idx = int(_match.group(1))
# the name
_the_name = _match.group(2)
_tmp_dict[_idx].append([_idx, _the_name, _value])
_ret = list(_tmp_dict.values())
你可能更喜欢这个,因为它应该更健壮,唯一的缺点是你需要内存来保存临时字典。
我正在尝试查询在使用高级自定义字段转发器的 Wordpress 站点中创建的一些选项,并从中创建一个 python 列表。
我的查询很好,但它是 returns 典型的 ACF“选项”转发器数据,它没有存储为序列化数组,而是每个字段都是一个单独的记录,如下所示:
option_name option_value
options_updates_notifier_contact_list_0_un_c_email kpirnie@example.com
options_updates_notifier_contact_list_0_un_c_name Kevin
options_updates_notifier_contact_list_1_un_c_email kpirnie+hub@example.com
options_updates_notifier_contact_list_1_un_c_name Kevin 2
options_updates_notifier_contact_list_2_un_c_email kpirnie+thehub@example.com
options_updates_notifier_contact_list_2_un_c_name Kevin 3
我的代码对此进行循环,并根据一些正则表达式收集所需的元素
# setup the regular expression to use
_re = r"options_updates_notifier_contact_list_(\d+)_un_c_(\w+)"
# hold our returnable list _ret = []
# if there are records
if _rs is not None:
# loop them
for _r in _rs:
# hold the field
_field = _r[0]
# hold the value
_value = _r[1]
# hold the RE match
_match = re.search( _re, _field )
# the index
_idx = int( _match.group( 1 ) )
# the name
_the_name = _match.group( 2 )
# insert at the set index
_ret.insert( _idx, [ _idx, _the_name, _value ] )
# this returns a IndexError: list index out of range
#_ret[ int( _match.group( 1 ) ) ].extend( [ _match.group( 2 ), _value ] )
print( _ret )
其中returns我以下列表:
[[0, 'name', 'Kevin'], [1, 'name', 'Kevin 2'], [2, 'name', 'Kevin 3'], [2, 'email', 'kpirnie+thehub@example.com'], [1, 'email', 'kpirnie+hub@example.com'], [0, 'email', 'kpirnie@example.com']]
我的目标是像这样返回列表:
[
[[0, 'name', 'Kevin'], [0, 'email', 'kpirnie@example.com']],
[[1, 'name', 'Kevin 2'], [1, 'email', 'kpirnie+hub@example.com']],
[[2, 'name', 'Kevin 3'], [2, 'email', 'kpirnie+thehub@example.com']]
]
其中每个名称|电子邮件组合都是它自己的列表项。我该怎么做?
如果您从当前结果开始,您可以像这样对数据进行排序、配对和验证:
data = [
[0, 'name', 'Kevin'],
[1, 'name', 'Kevin 2'],
[2, 'name', 'Kevin 3'],
[2, 'email', 'kpirnie+thehub@example.com'],
[1, 'email', 'kpirnie+hub@example.com'],
[0, 'email', 'kpirnie@example.com']
]
# Sorting
data = sorted(data, key=lambda item: item[0])
# Pairing
it = iter(data)
data = [list(item) for item in zip(it, it)]
# Validation
assert(all(el[0] == item[0][0] for item in data for el in item))
这是假设每个索引值有 2 条记录。如果不满足此条件,验证将不会通过并引发异常。
如果具有相似索引的记录数未知或可能不同,您可以将数据存储在临时字典中,然后提取值:
from collections import defaultdict
# setup the regular expression to use
_re = r"options_updates_notifier_contact_list_(\d+)_un_c_(\w+)"
# hold our returnable list
_ret = []
_tmp_dict = defaultdict(list)
# if there are records
if _rs is not None:
# loop them
for _r in _rs:
# hold the field
_field = _r[0]
# hold the value
_value = _r[1]
# hold the RE match
_match = re.search(_re, _field)
# the index
_idx = int(_match.group(1))
# the name
_the_name = _match.group(2)
_tmp_dict[_idx].append([_idx, _the_name, _value])
_ret = list(_tmp_dict.values())
你可能更喜欢这个,因为它应该更健壮,唯一的缺点是你需要内存来保存临时字典。