Как проверить, есть ли числа в списке в Python - PullRequest
2 голосов
/ 15 октября 2019

возможно ли проверить, есть ли определенные числа в списке в python? Если да, то как ты это делаешь?

Мой код выглядит следующим образом:

listA = [["scandium", 1541, 2830], ["titanium", 1668, 3287], ["vanadium", 1910, 3407], ["chromium", 1907, 2671], ["manganese", 1246, 2061], ["iron", 1538, 2862], ["cobalt", 1495, 2870], ["nickel", 1455, 2913], ["copper", 1085, 2562], ["zinc", 419.53, 907]]
listB = [["thing", 999, 333], ["you", 444, 555]] #this is just to test the code

melt = int(input("What is the melting point of your chosen element (in degrees Celcius): "))
boil = int(input("What is the boiling point of your chosen element (in degrees Celcius): "))

if melt in listA:
  for w in listA:
    if melt == w[1]:
      if boil == w[2]:
        print("Is", w[0], "your chosen element?")
if melt not in listA: 
  for x in listB:
    print(x[0]) #also just for testing purposes

Я вставил входы melt == 1541 и boil == 2830 и ожидал вывода Is scandium your chosen element?но вместо этого получил

thing
you

Напротив, входные данные для melt 999 и boil 333 работают (иш) с целью тестирования

Но как проверить, какой список заданвходные данные и найти этот элемент?

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

Редактировать!

Спасибо всем за помощь все ответы помогли мне и мневставьте все предложения (кроме try except else, если кто-то не хочет помочь: D) в мой код назначения (этот!). Все это правильные ответы, но поскольку я могу отметить только один, я отметил самый верхний. Еще раз спасибо!

Ответы [ 4 ]

3 голосов
/ 15 октября 2019

Первым условием является сравнение одного значения со списками. Отбросьте его и используйте вместо него:

for w in listA:
    if melt == w[1] and boil == w[2]:
        print("Is", w[0], "your chosen element?")
        break

И вместо второго условия (также с неправильным сравнением) вы можете добавить в цикл предложение else с (не идентифицируйте слово else, поскольку оно относится к первому for, а не к if):

else:
    for x in listB:
        print(x[0])
2 голосов
/ 15 октября 2019

Если при вводе melt пользователь вводит число, например 1541, тогда переменная melt будет содержать целое число, 1541. Однако ваш listA элементов содержит список из 3 элементов, строку и2 целых числа

Таким образом, когда вы проверяете, находится ли melt в listA, он ничего не находит, потому что сравнение 1541 с ["scandium", 1541, 2830] вернет False, поскольку оба не равны.

Кроме того, использование списка для хранения элементов и их точки кипения не является идеальным. К примеру, трудно получить доступ к точке кипения элементов, так как она находится в списке. Реализация словаря, или, что еще лучше, реализация фрейма данных (см. Pandas) будет намного более эффективной.

Чтобы вернуться к вашему коду, вот быстрое исправление:

for w in listA:
    if melt == w[1] and boil == w[2]:
        print("Is", w[0], "your chosen element?")

НаконецВы также должны иметь дело с проверкой ошибок ввода, чтобы подтвердить, что пользователь вводит правильные данные.

Редактировать: словари

С помощью словаря вы можете связать ключ сценность. Ключ и значение могут быть любыми: число, список, объекты, словари. Единственное условие - для ключа должен быть определен метод hash().

Например, вы можете сохранить элементы со строкой в ​​качестве ключа, а 2 температуры - в качестве значений.

elements = {"scandium": (1541, 2830), "titanium": (1668, 3287)}

Чтобы получить доступ к элементам, вы звоните elements["scandium"], который вернется (1541, 2830). Вы также можете получить доступ к элементам словаря с 3 функциями:

  • elements.keys(): вернуть ключи
  • elements.values(): вернуть значения
  • elements.items(): вернуть кортежи (ключ, значение)

Однако, опять же, нелегко получить доступ к отдельным температурам. Но на этот раз вы можете сравнить это следующим образом:

for key, value in elements.items():
    if (melt, boil) == value:
        print (key)

Но даже лучше, поскольку вы ищете элемент по температуре плавления и кипения, вы можете создать следующий словарь, где ключи являются кортежем (кипения, плавления) и значением является соответствующий элемент.

elements = {(1541, 2830): "scandium", (1668, 3287): "titanium"}

Затем, как только пользователь введет melt и boil, вы можете найти соответствующий элемент с помощью: elements[(melt, boil)]. На этот раз нет необходимости использовать цикл. Соответствующий элемент может быть непосредственно доступен. Аналогичная реализация может быть реализована с фреймом данных pandas.

Наконец, вы также можете реализовать это с помощью класса.

class Element:

    def __init__(self, name, melt, boil):
        self.name = name
        self.melt = melt
        self.boil = boil

elements = [Element("scandium", 1541, 2830), Element("titanium", 1668, 3287)]

Как таковой, класс Element использовать нельзякак ключ словаря. Чтобы его можно было использовать в качестве ключа, необходимо определить метод hash.

class Element:

    def __init__(self, name, melt, boil):
        self.name = name
        self.melt = melt
        self.boil = boil

    def __key(self):
        return (self.name, self.melt, self.boil)

    def __hash__(self):
        return hash(self.__key())

Но, опять же, не так просто получить доступ к элементу из переменных melt и boil. Цикл снова необходим.

1 голос
/ 15 октября 2019

Чтобы убедиться, что ваши входные данные действительно являются числами, вы можете сделать это:

# Check input validity.
while True:
    try:
        melt = int(input("What is the melting point of your chosen element (in degrees Celcius): "))
        boil = int(input("What is the boiling point of your chosen element (in degrees Celcius): "))
        break
    except ValueError:
        continue

# Rest of the work.
...

По сути, внутри цикла вы запрашиваете ввод у пользователя. Если int() завершается успешно, цикл завершается благодаря ключевому слову break, и вы можете смело предполагать, что melt и boil являются целыми числами в остальной части вашей программы. Если int() терпит неудачу, он вызывает ValueError, и здесь ключевое слово continue просто гарантирует, что мы снова зациклимся.

1 голос
/ 15 октября 2019

См. Ниже (обратите внимание, что код использует namedtuple для улучшения читабельности)

from collections import namedtuple

ElementProperties = namedtuple('ElementProperties', 'name melting_point boiling_point')
elements = [ElementProperties("scandium", 1541, 2830),
            ElementProperties("titanium", 1668, 3287),
            ElementProperties("vanadium", 1910, 3407),
            ElementProperties("chromium", 1907, 2671),
            ElementProperties("manganese", 1246, 2061),
            ElementProperties("iron", 1538, 2862)]

melt = int(input("What is the melting point of your chosen element (in degrees Celcius): "))
boil = int(input("What is the boiling point of your chosen element (in degrees Celcius): "))

for element in elements:
    if element.melting_point == melt and element.boiling_point == boil:
        print('Your element is: {}'.format(element.name))
        break
else:
    print('Could not find element having melting point {} and boilong point {}'.format(melt, boil))

, если элементы находятся в нескольких списках, код, приведенный ниже, должен работать:

from collections import namedtuple

ElementProperties = namedtuple('ElementProperties', 'name melting_point boiling_point')
elements1 = [ElementProperties("scandium", 1541, 2830),
            ElementProperties("titanium", 1668, 3287),
            ElementProperties("vanadium", 1910, 3407),
            ElementProperties("chromium", 1907, 2671),
            ElementProperties("manganese", 1246, 2061),
            ElementProperties("iron", 1538, 2862)]

elements2 = [ElementProperties("hydrogen", 5, 9)]


melt = int(input("What is the melting point of your chosen element (in degrees Celcius): "))
boil = int(input("What is the boiling point of your chosen element (in degrees Celcius): "))

found = False
for element_lst in [elements1,elements2]:
    if found:
        break
    for element in element_lst:
        if element.melting_point == melt and element.boiling_point == boil:
            print('Your element is: {}'.format(element.name))
            found = True
            break
if not found:
    print('Could not find element having melting point {} and boilong point {}'.format(melt, boil))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...