Python:逐个嵌套循环映射字段

Python:逐个嵌套循环映射字段,python,Python,Python:3.x 请通过将数据文件中可用的数字/名称前缀与下面定义的站点名称和站点代码进行映射,来帮助解决下面的嵌套循环 code: datafile = [{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, {'CallingNumber': '24324', 'CalledNumber': '+919099640', '

Python:3.x

请通过将
数据文件
中可用的数字/名称前缀与下面定义的
站点名称
站点代码
进行映射,来帮助解决下面的嵌套循环

code:

datafile = [{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, {'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}]

site_names = ('Site322', 'Site299')
site_codes = ('121', '24324')

afterFilter = []
for record in datafile:
    for Sname in site_names:
        if Sname in record['CallingPartition'] or Sname in record['CalledPartition']:
            afterFilter.append(record)
    for Scode in site_codes:
        if  Scode in record['CallingNumber'] or Scode in record['CalledNumber']:
            afterFilter.append(record)
print(afterFilter)
输出

    [
{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, 
{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, 
{'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}, 
{'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}
]
[
{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, 
{'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}, 
]
代码执行得很好,我能够通过映射
site\u name
site\u code
中设置的前缀来过滤所需的
dict

我想首先检查
site\u code
映射字段并追加结果,如果结果不匹配,我想检查
site\u code
并追加匹配的
dicts
。但问题是我不知道如何将其置于if..else条件下,并且我得到了重复输出,因为每个
dict
都有匹配的
site\u name
和匹配的
site\u code

预期输出

    [
{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, 
{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, 
{'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}, 
{'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}
]
[
{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, 
{'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}, 
]
请帮助如何检查站点\名称映射字段,如果不匹配,则需要检查站点\代码,因此不会重复append方法


提前感谢。

我还没有做任何测试,但它似乎正在运行:

afterFilter.append(record)
每个条目两次,使其输出加倍。 解决此问题的简单方法是检查记录是否已添加到列表中:

if !record in afterFilter: #Check if the record is already in the list:
    afterFilter.append(record) #Add to the list if not.

如果您的列表很长(500+),请考虑使用不同的If语句。

问题的关键在于您正在检查每条记录的Sname和Scode,因此每条记录确实会添加两次。 此解决方案跟踪每次搜索的结果,如果搜索成功,则不会进一步搜索

datafile = [{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, {'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}]

site_names = ('Site322', 'Site299')
site_codes = ('121', '24324')

afterFilter = []
for record in datafile:
    record_added = False
    for Sname in site_names:
        if Sname in record['CallingPartition'] or Sname in record['CalledPartition']:
            afterFilter.append(record)
            record_added = True
            break  # once a record has been added, there is no need to keep searching
    if record_added:  # if a record was added on the base of the Sname, no need to try other searches, so you can continue with the next record
        continue
    for Scode in site_codes:
        if  Scode in record['CallingNumber'] or Scode in record['CalledNumber']:
            afterFilter.append(record)
            record_added = True
            break  # once a record has been added, there is no need to keep searching

for item in afterFilter:
    print(item)
输出:

{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}
{'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}
更好的解决方案是定义一个函数,该函数在相关字段中查找标记,并且只添加一次记录:

datafile = [{'CallingNumber': '+9198136551', 'CalledNumber': '121', 'CalledPartition': 'Site299', 'CallingPartition': ''}, {'CallingNumber': '24324', 'CalledNumber': '+919099640', 'CalledPartition': 'Site322', 'CallingPartition': 'Site326'}]

site_names = ('Site322', 'Site299')
site_codes = ('121', '24324')

afterFilter = []


def count_tokens(tokens, a_string):
    return sum(1 for token in tokens if token in a_string)


for record in datafile:
    if count_tokens(site_names, record['CallingPartition']) or\
            count_tokens(site_names, record['CalledPartition']) or\
            count_tokens(site_codes, record['CallingNumber']) or \
            count_tokens(site_codes, record['CalledNumber']):
        afterFilter.append(record)

for item in afterFilter:
    print(item)

根据or的求值规则,函数按顺序调用,直到其中一个变为真,而不是进一步调用。在您的示例中,因为所有记录都被捕获在“CallingPartition”或“CalledPartition”中,所以分析代码永远不会是否定的。

Hallo Marques。。这太完美了。我发现第二个选项很有用,非常感谢您的帮助。