我有这个清单:
box = ["apple","orange","banana", "water"]
这个字符串:
CheckList = "1, orange | 2, apple | 3, banana | 4, milk"
注意:该字符串包含"|"
和","
分隔符。 |
分隔符分隔每个项目,,
分隔符在项目及其键之间分隔(即key
,item
|
key
,{ {1}}等)
问题:
我想遍历item
列表中的每个项目,并在字符串box
中找到corespoinding key
。
输出应该是这样的:
CheckList
我是一般文本处理和编程的佼佼者,任何想法如何解决这个问题?
我试过了,但没有帮助。
foundItems = ["2","1","3", "water"]
答案 0 :(得分:2)
首先,从CheckList
获取映射,然后从box
查找:
box = ["apple","orange","banana", "water"]
CheckList = "1, orange | 2, apple | 3,banana | 4,milk"
d = dict(reversed(items.split(',')) for items in CheckList.replace(' ', '').split('|'))
foundItems = [d[x] if x in d else x for x in box]
print foundItems
注意字符串中的空格。
答案 1 :(得分:1)
如果CheckList
中的空格不一致(实际上它们不在您给出的示例中),我建议先运行CheckList = CheckList.replace(" ","")
以消除所有空格。否则,请务必split
使用" | "
或", "
。
除此之外,您的代码应该可以正常工作。如果使用foundItems = box.copy()
初始化,那么您的循环可能看起来像
for i in CheckList.split("|"): # or " | "
for j in range(len(box)):
if i.split(",")[1] == box[j]:
foundItems[j] = i.split(",")[0]
使用j in range(len(box))
代替j in box
意味着可以轻松访问foundItems
的相应元素。
答案 2 :(得分:1)
首先,看起来你正在检查i.split(",")
中的错误索引。 Python是0索引的,所以当你引用i.split(",")[0]
时,你正在检查逗号的左侧(在这种情况下是键),当它看起来你想要它检查右侧(水果)。
其次,
确保在解析像这样的字符串时剥离空格。例如,CheckList中的第一项是“1,橙色”。当您在“,”上拆分时,会得到一个由["1"," orange "]
组成的数组。注意字符串橙色之前和之后的空格。如果您尝试将"orange"
与" orange "
进行比较,您会发现它们并不相同。您可以调用i.split(",")[1].strip()
删除任何前导和尾随空格。
最后,这个功能效率不高。当你在另一个for循环中有一个for循环时,你正在CheckList中为每个元素检查每个元素。这是O(n ^ 2)复杂度。对于4个项目来说,这不是什么大不了的事,但如果这些列表更大,那么时间会迅速增加。以下是我将如何编写此函数:
box = ["apple","orange","banana", "water"]
CheckList = "1, orange | 2, apple | 3,banana | 4,milk"
CheckDict = {}
for i in CheckList.split("|"):
j = i.split(",")
CheckDict[j[1].strip()] = j[0].strip()
foundItems = []
for i in box:
if i in CheckDict:
foundItems.append(CheckDict[i])
else:
foundItems.append(i)
答案 3 :(得分:0)
这里的答案很好,我以为我会提供这种双线。
>>> d = {i.split(',')[1].strip():i.split(',')[0] for i in checkList.split('|')}
>>> print [d[key].strip() if key in d else key for key in box]
['2', '1', '3', 'water']