遍历多个字符串列表以找到一个公共值

时间:2018-09-20 19:46:23

标签: python list

我试图提出一些建议,以便在以下每个字符串列表中找到子字符串“ angle”:

ListA = ['angle 45', 'color red', 'inside t']

ListB = ['angle 135', 'color blue', 'inside f']

ListC = ['above r', 'angle 315', 'color pink', 'inside o']

我需要添加几张支票

1)仅在所有3个列表中都存在“角度”

2)并且如果listA的“角度”值不等于listC的角度值,

然后获取listC的角度值,减去90,然后将新字符串放回列表中。 因此,listC现在看起来像:

ListC = ['above r', 'angle 225', 'color red', 'inside r']

我尝试在空白处分割这些列表以创建类似以下的列表:

['angle', '45', 'color', 'red', 'inside', 't']

但是,我很难遍历所有3个列表,然后进行后续检查,提取值并替换。 我想知道是否需要创建新的字典或列表才能完全实现这一目标。

更新 这就是我检查所有三个列表中的“ angle”,然后进一步拆分每个列表的内容。我还没有弄清楚的是,现在我已经将角度值与其分开了,我不确定如何检查listA的角度值不等于listB的角度。我还没有去拉取值,更新它并放回它。

if any("angle " in s for s in listA) and any("angle " in s for s in listB) \
    and any("angle" in s for s in listC):
    listASplit = []
    for word in listA:
        word = word.split(" ")
        listASplit.extend(word)

    listBSplit = []
    for word in listB:
        word = word.split(" ")
        listBSplit.extend(word)

    listCSplit = []
    for word in listC:
        word = word.split(" ")
        listCSplit.extend(word)

5 个答案:

答案 0 :(得分:3)

您在这里有很多事情要做,但是我同意在这里使用字典会更好。

首先,让我们分析列表

dictA = {}

for item in ListA:
    row = item.split(" ")
    dictA[row[0]] = row[1] 

对每个列表执行相同的操作,然后可以比较字典的值而无需进一步循环。

if dictA['angle'] != to dictC['angle']:
    ...dostuff...

不要忘了在需要时强制转换为适当的类型

答案 1 :(得分:2)

lista = ['angle 45', 'color red', 'inside t'] 
listb = ['angle 135', 'color blue', 'inside f'] 
listc = ['above r', 'angle 315', 'color pink', 'inside o']
kw = 'angle'
results = []

for item in lista:
    if kw in item:
        results.append(item)
for item in listb:
    if kw in item:
        results.append(item)
for x in range(len(listc)):
    if kw in item[x]:
        results.append(item)
        index = x

if int(results[0].split()[1]) != int(results[2].split()[1]):
    lastindex = results[2].split()
    listc[index] = lastindex[0]+' '+str(int(lastindex[1])-90)
for x in results:
    print(x)

因此解释:

我添加了一个名为kw的新变量,它只包含我们要搜索的关键字。

我还创建了一个名为results的空列表,用于存储匹配及其值。

当我们迭代listc时,我们迭代列表的长度范围,以便我们可以提取索引(以后替换字符串)。

因此,我们检查所有列表中的关键字,并与append()匹配results

此后,我们检查第一个和最后一个值不匹配。如果是这样,那么我们可以拆分从listc提取的字符串,然后从值中减去90,然后再将其重新连接在一起并替换为listc

中的字符串

答案 2 :(得分:1)

error: Build input file cannot be found: '/Users/myUser/Documents/myAwesomeProject/node_modules/react-native/third-party/double-conversion-1.1.6/src/cached-powers.cc'

** BUILD FAILED **



The following build commands failed:
    CompileC /Users/myUser/Documents/myAwesomeProject/ios/build/Build/Intermediates.noindex/React.build/Debug-iphonesimulator/double-conversion.build/Objects-normal/x86_64/cached-powers.o /Users/myUser/Documents/myAwesomeProject/node_modules/react-native/third-party/double-conversion-1.1.6/src/cached-powers.cc normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)

[“在r上方”,“角度225”,“粉红色”,“在o内”]

答案 3 :(得分:1)

通过功能对您的工作进行分区:

def index_of_angle(lst):
    for string in lst:
        if string.startswith("angle"):
            return lst.index(string)
    # implicitly returns None if angle is not found

def get_angles(*lsts):
    return [index_of_angle(lst) for lst in lsts]

现在这很容易理解:

a, b, c = get_angles(ListA, ListB, ListC)

if None not in [a, b, c]:  # Check 1 is obvious
    if ListA[a] != ListC[c]:  # Check 2 is obvious
        new_angle = int(ListC[c].split()[1]) - 90  # split by default is on spaces
        ListC[c] = "angle %d" % new_angle

更明确地说,您可以将get_angles重命名为get_angles_or_none,以明确如果找不到角度,它会给出None


处理可能出现多个角度的输入(此输入应舍弃):

def index_of_angle(lst):
    index_found = None
    for string in lst:
        if string.startswith("angle"):
            if index_found is not None:
                index_found = None  # if multiple angles found, set return to None
                break  # if two angles found, no need to keep looking
            index_found = lst.index(string)
    return index_found # returns angle or None if not found/multiple

这将稍微慢一些,因为一旦找到角度我们就无法返回(必须确保首先不存在另一个角度输入)。

答案 4 :(得分:1)

对不起,我参加了布朗队的比赛,本来可以使您的生活更轻松:)

listd = [lista, listb, listc]

if 'angle' in ''.join(lista) and ''.join(listb) and ''.join(listc):
    for idx, item, in enumerate(lista):
        for x, i in enumerate(listc):
            if 'angle' in item and 'angle' in i:
                if item.split()[1] != i.split()[1]:
                    listc[x] = i.split()[0] + ' ' + str(int(i.split()[1]) - 90)

print(listd)
[['angle 45', 'color red', 'inside t'], ['angle 135', 'color blue',
'inside f'], ['above r', 'angle 225', 'color pink', 'inside o']]