Проверка существования значения в случайно сгенерированном массиве - PullRequest
3 голосов
/ 05 апреля 2019

Массив случайно генерируется фиксированным кодом, и мы должны работать на основе этого кода. Мне нужно проверить, существует ли конкретное значение в массиве или нет.

Я пробовал эти два решения, но ни одно из этих работ:

if a[5][0] in a
if a[5][0] != ""

Я привел пример массива

[['Stack 5', 'Suit C', 9, 0],
  ['Stack 4', 'Suit B', 6, 0],
  ['Stack 6', 'Suit B', 8, 0],
  ['Stack 3', 'Suit C', 3, 0],
  ['Stack 1', 'Suit C', 10, 0],
  ['Stack 2', 'Suit B', 4, 0]]

В основном мне нужно проверить, присутствует ли в массиве 'Stack X', а затем выполнить операции. Иногда случайно сгенерированный массив может пропустить какой-либо определенный стек, например,

[['Stack 5', 'Suit C', 9, 0],
 ['Stack 4', 'Suit B', 6, 0],
 ['Stack 6', 'Suit B', 8, 0],
 ['Stack 3', 'Suit C', 3, 0],
 ['Stack 2', 'Suit B', 4, 0]]

В этом случае стек 1 не генерируется, и мне нужно проверить, сгенерирован он или нет. Это в основном массив в массиве.

EDIT: Спасибо за вашу помощь, ребята, но я решил проблему с помощью цикла for. Вот код, который я использовал.

for i in range(len(a)):
    if a[i][0] == 'Stack 1':

Ответы [ 5 ]

1 голос
/ 05 апреля 2019

Для этого нет встроенного синтаксиса. Вероятно, лучший способ - использовать any и составить список

In [8]: data = [['Stack 5', 'Suit C', 9, 0], 
   ...:  ['Stack 4', 'Suit B', 6, 0], 
   ...:  ['Stack 6', 'Suit B', 8, 0], 
   ...:  ['Stack 3', 'Suit C', 3, 0], 
   ...:  ['Stack 2', 'Suit B', 4, 0]]                                                                       

In [9]: any(l[0] == 'Stack 1' for l in data)                                                                
Out[9]: False

In [10]: any(l[0] == 'Stack 3' for l in data)                                                               
Out[10]: True
1 голос
/ 05 апреля 2019

Примерно так будет работать:

def a_contains(num):
    for item in a:
        if 'Stack {}'.format(num) in item:
            return True
    return False
0 голосов
/ 05 апреля 2019

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

yourList = [['Stack 5', 'Suit C', 9, 0],['Stack 4', 'Suit B', 6, 0], ['Stack 6', 'Suit B', 8, 0], ['Stack 3', 'Suit C', 3, 0], ['Stack 1', 'Suit C', 10, 0], ['Stack 2', 'Suit B', 4, 0]]
filteredList = list(filter(lambda x: 'Stack 1' in x, yourList))
if (len(filteredList) > 0):
    #your code
0 голосов
/ 05 апреля 2019

Для цикла каждый раз проверяет в каждом подмассиве, существуют ли запрошенные значения.

Проверьте приведенный ниже код.

data = [['Stack 5', 'Suit C', 9, 0],
  ['Stack 4', 'Suit B', 6, 0],
  ['Stack 6', 'Suit B', 8, 0],
  ['Stack 3', 'Suit C', 3, 0],
  ['Stack 1', 'Suit C', 10, 0],
  ['Stack 2', 'Suit B', 4, 0]]

req = "Stack 8"
ans = ""
for l in data:
  if req in l:
    ans = "yes"
    break
  else:
    ans = "no"

print(ans)
0 голосов
/ 05 апреля 2019

Если вы хотите выбросить их в массив numpy, вы можете нарезать первый столбец и выполнить проверку следующим образом:

import numpy
data = numpy.array([['Stack 5', 'Suit C', 9, 0],
  ['Stack 4', 'Suit B', 6, 0],
  ['Stack 6', 'Suit B', 8, 0],
  ['Stack 3', 'Suit C', 3, 0],
  ['Stack 1', 'Suit C', 10, 0],
  ['Stack 2', 'Suit B', 4, 0]])

if 'Stack 6' in data[:, 0]: # index all rows, and only first column
    print('yes')
if 'Stack 18' in data[:, 0]:
    print('found')
else:
    print('nope')

Выходы:

yes
nope

Дополнительно a print(data[:, 0]) дает:

['Stack 5' 'Stack 4' 'Stack 6' 'Stack 3' 'Stack 1' 'Stack 2']

Я думаю , что использование нарезки в массиве numpy быстрее, чем итерация по списку, но я не рассчитал это лично

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...