我正在尝试创建一个列表,其中包含基于另一个子列表(下面的数据)中的元素的字典中的键子列表。
我有一个函数试图遵循这个逻辑:
- 查看子列表中的元素是否与字典 中的任何精确值匹配
- 如果存在,则将关联的字典键附加到新列表中的子列表
- 如果没有,尝试将元素转换为整数,并将其附加到新列表 中的子列表中。
- 如果这不起作用,将整个子列表附加到一个全新的列表
- 返回一个包含从原始文件中的字符串转换而来的整数子列表的列表和一个包含不能转换的子列表的列表
我希望这个逻辑是有意义的。由于对这个问题的前一个版本的一些评论(使用基于与字典值匹配的字典中的键替换子列表中的元素),我编辑了代码和字典,因此re.search
函数现在可以工作了。下面是新代码:
import re
def conversion(d, file):
key_list = list(d.keys())
for i in range(0, 21):
for j in file:
for k in j:
good1 = []
good1a = []
good2 = []
good2a = []
bad1 = []
bad2 = []
if k == d[i]:
good1a.append(key_list[i])
good1.append(good1a)
if isinstance(int(k), int):
if int(k) <= 20:
good2a.append(int(k))
good2.append(good2a)
else:
bad1.append(j)
else:
bad2.append(j)
list1 = []
list2 = []
list1.append(good1)
list1.append(good2)
list2.append(bad1)
list2.append(bad2)
return list1, list2
然而,这并不是我所期望的输出:
([[], []], [[], []])
这可能与我的列表的位置有关,但是我真的是python的新手,我还没有遵循事情应该去哪里的逻辑。
任何帮助将不胜感激!
许多谢谢,
卡罗莱纳州
数据:
d = {0: "zero, null",
1: "one, un, eins",
2: "two, deux, zwei",
3: "three, trois, drei",
4: "four, quatre, vier",
5: "five, cinq, funf",
6: "six, sechs",
7: "seven, sept, sieben",
8: "eight, huit, acht",
9: "nine, neuf, neun",
10: "ten, dix, zehn",
11: "eleven, onze, elf",
12: "twelve, douze, zwolf",
13: "thirteen, treize, dreizehn",
14: "fourteen, quatorze, vierzehn",
15: "fifteen, quinze, funfzehn",
16: "sixteen, seize, sechzehn",
17: "seventeen, dix-sept, siebzehn",
18: "eighteen, dix-huit, achtzehn",
19: "nineteen, dix-neuf, neunzehn",
20: "twenty, vingt, zwanzig"}
file = [['16', '10', '8', '3', '7'], ['8', '9', '19', '20', '4'], ['sechs', 'acht', 'sechzehn', 'funf', 'null'], ['1', '30', '2', '5', '7'], ['vierzehn', 'eins', 'zwei', 'neun', 'drei'], ['six', 'neuf', 'seize', 'zero'], ['fourteen', 'eleven', 'forteen', 'eight', 'twenty'], ['douze', 'onze', 'huit', 'quinze', 'sept'], ['18', '9', '9', '22', '4'], ['un', 'trois', 'quatorze', 'dix-huit', 'vingt'], ['five', 'three', 'nineteen', 'twenty', 'zero'], ['einundzwanzig', 'vierzehn', 'eins', 'zwei', 'vier']]
试试这个:
import re
def conversion(d, file):
list1 = []
list2 = []
for key, value in d.items():
for i in file:
list3 = []
for j in i:
good = []
if re.search(fr"b{re.escape(j)}b", value):
good.append(key)
list3.append(good)
else:
try:
good.append(int(j))
list3.append(good)
except:
bad = []
bad.append(i)
list1.append(list3)
list2.append(bad)
return list1.Append(list2)
使用for循环尝试通过regex单词边界将子列表中的每个number
与字典中的值(完整写入的数字)匹配。如果匹配,则将相应编号的key
添加到匹配列表中,并中断循环;如果number
不存在于字典中任何拼写出来的数字中,那么,使用try/expect
来检查number
是否可以转换为整数。如果可以转换,则将整数加到sublist_match
,否则加到sublist_no_match
。
def conversion(d, file):
matched = []
no_match = []
for sublist in file:
sublist_match = []
sublist_no_match = []
for number in sublist:
for key, str_values in d.items():
if re.search(fr"b{re.escape(number)}b", str_values):
sublist_match.append(key)
break
else:
try:
num_item = int(number)
except ValueError:
sublist_no_match.append(number)
else:
sublist_match.append(num_item)
matched.append(sublist_match)
no_match.append(sublist_no_match)
return [matched, no_match]
result = conversion(d,file)
print(result)
结果
[[[16, 10, 8, 3, 7],
[8, 9, 19, 20, 4],
[6, 8, 16, 5, 0],
[1, 30, 2, 5, 7],
[14, 1, 2, 9, 3],
[6, 9, 16, 0],
[14, 11, 8, 20],
[12, 11, 8, 15, 7],
[18, 9, 9, 22, 4],
[1, 3, 14, 18, 20],
[5, 3, 19, 20, 0],
[14, 1, 2, 4]],
[[], [], [], [], [], [], ['forteen'], [], [], [], [], ['einundzwanzig']]]