如何访问分隔字符串中的每个项目以在列表中查找其匹配项目?

时间:2016-08-12 14:53:55

标签: python string list for-loop replace

我有这个清单:

box = ["apple","orange","banana", "water"]

这个字符串:

CheckList = "1, orange | 2, apple | 3, banana | 4, milk"

注意:该字符串包含"|"","分隔符。 |分隔符分隔每个项目,,分隔符在项目及其键之间分隔(即keyitem | key,{ {1}}等)

问题: 我想遍历item列表中的每个项目,并在字符串box中找到corespoinding key

输出应该是这样的:

CheckList

我是一般文本处理和编程的佼佼者,任何想法如何解决这个问题?

我试过了,但没有帮助。

foundItems = ["2","1","3", "water"]

4 个答案:

答案 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']