2016-08-12 72 views
0

我有这样的名单:如何访问分隔字符串中的每个项目以在列表中查找其匹配项目?

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

而这个字符串:

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

注:,该字符串具有"|"","分隔符。该|分隔符单独的每个项目和,分隔符的项目及其主要之间独立(即keyitem|keyitem等)

问题: 我想通过每个项目在box列表进行迭代和在字符串CheckList中找到核心指向key

输出应该是这样的:

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

我是一个初学者到文本处理和编程一般情况下,任何想法如何解决这个问题?

我试过这个,但没有帮助。

for i in CheckList.split("|"): 
    for j in box: 
     if i.split(",")[0] == j 
+1

如果您找不到密钥,您希望相应的找到的项目本身? –

+0

是的,只有在'box'列表中找到的项目才会在'foundItems'中有相应的键,否则它应该将这个项目保存在'CheckList'中没有对应键的'box'中。 – MEhsan

+0

只是为了好玩:基于正则表达式的方法:https://ideone.com/ZIK6a2 –

回答

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相应的元素。

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) 
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 

,请注意空间的的字符串中。

+0

你太棒了!我编辑了“CheckList”以使其一致。 – MEhsan

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'] 
相关问题