список.удалить(x): нет в списке, даже если это образец из этого списка

#python

Вопрос:

У меня было много проблем, чтобы наладить связь с клиентским сервером, но, наконец, добившись того, что у меня есть одна последняя небольшая проблема, с которой я не могу смириться. У меня есть список «акций», на котором я запускаю функцию, которая изменяет стоимость указанных акций в определенном диапазоне, и еще один, который «меняет» исходный список, другими словами, создает другой список в том же стиле, что и первый, с новыми значениями. После этого я устанавливаю соединение между клиентом и серверным процессом и выбираю образец из созданного списка, а после перехода между процессами и обратно есть опция, при которой, если клиент решит принять этот запас, сервер должен отправить его, а затем продолжить его удаление. Все в коде работает нормально, и товар отправляется, за исключением того факта, что после отправки товара я не могу удалить его из своего списка на стороне сервера, так как получаю ошибку list.remove(x): x not in list .

Код сервера (исправленная версия)

 import pickle
import socket
import struct
from _thread import *
import random
from time import sleep

PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST, PORT)
ThreadCount = 0
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
records = [('Empresa:', 'Altri', 'Cotação:', 5.37), ('Empresa:', 'BCP', 'Cotação:', 0.13),
           ('Empresa:', 'Corticeira Amorim', 'Cotação:', 10.58), ('Empresa:', 'CTT', 'Cotação:', 5.12),
           ('Empresa:', 'EDP Renováveis', 'Cotação:', 20.64),
           ('Empresa:', 'EDP', 'Cotação:', 4.67), ('Empresa:', 'Galp', 'Cotação:', 8.70),
           ('Empresa:', 'Ibersol', 'Cotação:', 5.82), ('Empresa:', 'Jerónimo Martins', 'Cotação:', 16.83),
           ('Empresa:', 'Mota-Engil', 'Cotação:', 1.35),
           ('Empresa:', 'NOS', 'Cotação:', 3.03), ('Empresa:', 'Novabase', 'Cotação:', 4.60),
           ('Empresa:', 'PHAROL', 'Cotação:', 0.11), ('Empresa:', 'REN', 'Cotação:', 2.37),
           ('Empresa:', 'Semapa', 'Cotação:', 11.50), ('Empresa:', 'Sonae', 'Cotação:', 0.80),
           ('Empresa:', 'Sonac', 'Cotação:', 0.77), ('Empresa:', 'The Navigator Company', 'Cotação:', 2.96)]


def create_random_numbs(input_list):
    output_numbers = []
    for given_number in input_list:
        max = given_number * 1.25
        min = given_number * 0.75
        random_number = random.random()
        random_number_in_desired_range = min   (random_number * (max - min))
        output_numbers.append(random_number_in_desired_range)
    return output_numbers


def swap():
    input_numbers = [x[-1] for x in records]
    new_numbers_in_desired_range = create_random_numbs(input_numbers)
    new_records = []
    for item, new_number in zip(records, new_numbers_in_desired_range):
        item_as_list = list(item)
        item_as_list[-1] = new_number
        new_records.append(tuple(item_as_list))
    return new_records


output = swap()
swap()
print(output)

try:
    tcp.bind(ADDR)
except socket.error as e:
    print(str(e))

print("A aguardar ligação")
tcp.listen(10)


def handle_client(connection):
    connection.send(str.encode('Bem vindo à bolsa'))
    data = connection.recv(2048)
    while True:
        stock = random.sample(output, 1)
        order = pickle.dumps(stock)
        if data.decode('utf-8') == 'Quero trocar!':
            print("Pedido de troca recebido")
            size = len(order)
            size_in_4_bytes = struct.pack('I', size)
            connection.send(size_in_4_bytes)
            sleep(0.2)
            connection.send(order)
            sleep(0.2)
            reply = connection.recv(2048)
            if reply.decode('utf-8') == 'Y':
                size = len(order)
                size_in_4_bytes = struct.pack('I', size)
                connection.send(size_in_4_bytes)
                sleep(0.2)
                connection.send(order)
                sleep(0.2)
                output.remove(stock[0])
                print(f"A nova lista de ações é{output}")
                break
            elif reply.decode('utf-8') == 'N':
                print("Não quer comprar a ação.")
                break
    connection.close()


while True:
    Client, address = tcp.accept()
    print('Ligado a: '   address[0]   ':'   str(address[1]))
    start_new_thread(handle_client, (Client,))
    ThreadCount  = 1
    print('Número de ligações: '   str(ThreadCount))
tcp.close()


 

Комментарии:

1. Что делать, если вы повторите цикл более одного раза? Это наверняка произойдет после того, как вы запустите эту строку.

2. так ты хочешь сказать, что цикл продолжается? поэтому я просто попытался вложить операторы if и добавить разрывы, но это все равно происходит

3. это правда! Я поместил его в цикл while true, я не пробовал это с несколькими клиентами, поэтому еще не заметил. Спасибо!

Ответ №1:

Это просто, что random.sample() всегда возвращает список, даже если вы просите только 1 элемент, поэтому вы проверяете, есть ли [x] (и нет x ) [x, y, z] , что, очевидно, ложно. Замените его на random.choice() , что дает только один элемент, или измените его на что-то вроде output.remove(stock[0]) .

Ответ №2:

Сначала проверьте, есть ли объект в списке:

если x в списке: список.удалить(x)

Комментарии:

1. Я попробовал это, но это не исправляет, так как в первую очередь он не учитывает запасы, существующие в списке, он просто запускает код и игнорирует это