Python 3.x: печать определенных элементов массива - PullRequest
0 голосов
/ 22 мая 2018

У меня есть два вложенных массива , которые могут выглядеть следующим образом:

firstArray=[[1,10],[11,31],[32,40],[41,61],[62,78]]
secondArray=[[1,10],[12,32],[33,39],[41,78]]

Теперь я хочу выполнить поиск элементов secondArray в firstArray.Я хочу, чтобы два события были различены:

1: , если элемент найден напрямую, я хочу напечатать его.

2: Если это не найдено, я хочу напечатать предыдущий и следующий элемент, или элементы, которые он охватывает, / элементы, которые его содержат.

Например, , для второго массива [1,10] я хочу напечатать firstArray [1,10], но для secondArray [12,32] я хочу напечатать firstArrays [11,31] и [32,40].Для secondArray [33,39] я хочу напечатать firstArray [32,40] и т. Д.

Я знаю, что могу получить доступ к двум массивам с помощью вложенного цикла for и что я могу получить доступ к элементам черезиндексации.У меня проблемы с выполнением роли, если нет прямых попаданий.

для прямых попаданий , я делаю следующее:

foundYou=[]
for entry in firstArray:
    for element in secondArray:
        if(entry[0] == element[0]) and (entry[1] == element[1]):
            foundYou.append(element)

Я такжепровел какое-то исследование об индексации, но не смог понять, как это решить.Я также подумал об использовании <=,> =, <и>, но тогда он напечатал бы все элементы с меньшим номером, чем поиск в первой позиции, но он напечатал бы намного больше, чем я хочу.

Я мог бы "проиндексировать", используя карту и другой массив со значениями от 1 ... длины массива, но это, кажется, довольно сложный способ достижения того, что я хочу.

Заранее спасибо:)

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

У меня есть следующее:

firstArray=[[1,10],[11,31],[32,40],[41,61],[62,78]]
secondArray=[[1,10],[12,32],[33,39],[41,78]]

for s2, e2 in secondArray:
  foundYou = []
  for entry in firstArray:
    s1, e1 = entry
    if s1 <= s2 and e1 >= e2:
      foundYou.append(entry) # We are fully contained within one entry
    elif s1 <= s2 and e1 <= e2 and s2 <= e1:
      foundYou.append(entry) # The start is within this entry but the end is in another
    elif s1 >= s2 and e1 >= e2 and s1 <= e2:
      foundYou.append(entry) # The end is within this entry but the start is in another
    elif s1 >= s2 and e1 <= e2:
      foundYou.append(entry) # This entry is entirely enveloped

  print(foundYou)

Вывод:

[[1, 10]]
[[11, 31], [32, 40]]
[[32, 40]]
[[41, 61], [62, 78]]

Если кому-то нравится минимизировать это, пожалуйста, сделайте!

0 голосов
/ 22 мая 2018

Вы можете попробовать вот так:

firstArray=[[1,10],[11,31],[32,40],[41,61],[62,78]]
secondArray=[[1,10],[12,32],[33,39],[41,78]]

for index2 in range(len(secondArray)):
    if secondArray[index2] == firstArray[index2]:
        print(secondArray[index2])
    else:
        try:
            print(firstArray[index2], firstArray[index2+1])
        except IndexError as e:
            print(e)

Вывод:

 [1, 10]
 [11, 31] [32, 40]
 [32, 40] [41, 61]
 [41, 61] [62, 78]

Объяснение:

Здесь нам нужно проверить элементы secondArray с firstArray.Так итерируйте по второму массиву

for index2 in range(len(secondArray)):

Используя if, проверьте, равен ли элемент во втором массиве первому массиву в соответствующей позиции

if secondArray[index2] == firstArray[index2]:

Если условие удовлетворяет, выведите значениев противном случае он должен распечатать элемент и следующий элемент из первого массива

print(firstArray[index2], firstArray[index2+1])
0 голосов
/ 22 мая 2018

Вы можете попробовать это, я печатаю значение и соответствующий ему результат.

firstArray=[[1,10],[11,31],[32,40],[41,61],[62,78]]
secondArray=[[1,10],[12,32],[33,39],[41,78]]

foundYou=[]
for second in secondArray:
    for firstindex,first in enumerate(firstArray):
        if second == first:
            foundYou.append(first)
            print(second,":",first)
        else:
            if second[0] >= first[0] and second[1] <= first[1]:
                foundYou.append(first)
                print(second,":",first)
            else:
                try:
                    if second[0] >= first[0] and second[1] <= firstArray[firstindex+1][1] and second[0] < first[1]:
                        foundYou.append(first)
                        foundYou.append(firstArray[firstindex+1])
                        print(second,":",first,firstArray[firstindex+1])
                except IndexError:
                    pass

Вывод:

[1, 10] : [1, 10]
[12, 32] : [11, 31] [32, 40]
[33, 39] : [32, 40]
[41, 78] : [41, 61] [62, 78]
0 голосов
/ 22 мая 2018

попробуйте это:

firstArray=[[1,10],[11,31],[32,40],[41,61],[62,78]]
secondArray=[[1,10],[12,32],[33,39],[41,78]]

foundYou=[]
didNotFindYou=[]
for element in secondArray:
      if element in firstArray:
         foundYou.append(element)
      else:
         index = firstArray[secondArray.index(element)]
         nextindex = firstArray[secondArray.index(element)+1]
         didNotFindYou.append([index, nextindex])
print('found:', foundYou)
print('did not find:', didNotFindYou)

Вывод:

found: [[1, 10]]
did not find: [[[11, 31], [32, 40]], [[32, 40], [41, 61]], [[41, 61], [62, 78]]]

Я выполняю итерацию по secondArray только потому, что вы сказали, что хотите проверить, находятся ли элементы в secondArray в firstArray, это для строки 6. И затем я проверяю, находится ли элемент в firstArray, это для строки 7. А затем я получаю индекс элемента в secondArray, а затем получаю элемент с таким жеиндекс в firstArray, это в строке 10. И затем я сделал то же самое, что упомянуто в строке 10, но я просто добавил 1 к индексу, это для строки 11.

, если вам нужна дополнительная помощья отредактирую свой ответ и сообщу вам решение для того, что вы просили

...