Nano Hash - криптовалюты, майнинг, программирование

Как проверить, можно ли найти подстроку в двух строках, но не в третьей?

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

Вот некоторые примеры данных, с которыми я работаю (переменная: market_list):

[{'MarketName': 'ETH-ADA', 'High': 0.00061957, 'Low': 0.00054578, 'Volume': 10390622.69836943},
{'MarketName': 'USDT-ADA', 'High': 0.64899993, 'Low': 0.434, 'Volume': 30152195.40488637},
{'MarketName': 'BTC-VTC', 'High': 0.00037478, 'Low': 0.00031501, 'Volume': 800033.42837477},
{'MarketName': 'BTC-ADA', 'High': 5.645e-05, 'Low': 4.73e-05, 'Volume': 124383204.30281776},
{'MarketName': 'ETH-LTC', 'High': 0.18977579, 'Low': 0.165721, 'Volume': 13687.21249759},
{'MarketName': 'BTC-LTC', 'High': 0.0170725, 'Low': 0.01478, 'Volume': 145304.12269212},
{'MarketName': 'USDT-NEO', 'High': 154.0, 'Low': 92.2, 'Volume': 257431.011762},
{'MarketName': 'ETH-NEO', 'High': 0.14278059, 'Low': 0.11397457, 'Volume': 64208.17297524}]

Я пытаюсь проверить этот список словарей на наличие комбинаций подстроки, которые можно найти в других строках (с исключениями). Так, например, «ETH-ADA» и «BTC-ADA», за исключением USDT-ADA (тот, который я хочу опустить).

Прямо сейчас у меня есть что-то вроде этого:

my_list = []
for x in market_list:
    coin = x['MarketName'].split("-")[1]
    if "USDT" not in x['MarketName']:
        if market_list.count(coin) == 2:
            my_list.append(coin)

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

Я часто оказываюсь в такой ситуации, поэтому, пожалуйста, объясните, почему вы ответили, чтобы я мог лучше понять «менталитет программиста». Это самая сложная часть обучения программированию для меня.

Редактировать: как кто-то сказал в комментариях, было бы разумно объяснить мой ожидаемый результат.

Я хочу, чтобы список, упомянутый выше, выводил пары, которые имеют общие ETH и BTC, но не USDT, так что это даст:

[ADA,LTC]
17.01.2018

  • не используйте set, list, dict , tuple и т. д. в качестве имен переменных, таким образом вы скрываете типы python и позже столкнетесь с проблемами 18.01.2018
  • вы можете использовать a,b = x["MarketName"].split("-") для разложения вашего разделения на две переменные, чтобы проверить обе части вашего разделенного ключа на 'USDT' или монету или что-то еще 18.01.2018
  • @PatrickArtner Конечно, ты прав. Это не мой реальный код, а гораздо более читаемый пример. Я отредактирую его, чтобы устранить любую путаницу. 18.01.2018
  • @PatrickArtner Часть [if list.count(coin) == 2:] - это то, что я пытаюсь увидеть, существует ли подстрока дважды в списке, но, как вы видите, это не работает. 18.01.2018
  • @PatrickArtner Дерьмо, ты прав, я снова отредактировал пример. 18.01.2018
  • Я предлагаю вам ознакомиться с рекомендациями по как задать хороший вопрос и, в частности, включить в свой вопрос результат вы надеетесь получить и результат, который вы получаете в настоящее время. 18.01.2018
  • @NathanVērzemnieks Спасибо за ссылку! Я прочитаю это сразу же, так как я тоже новичок в том, чтобы задавать здесь вопросы. 18.01.2018

Ответы:


1
data =  [{'MarketName': 'ETH-ADA', 'High': 0.00061957, 'Low': 0.00054578, 'Volume': 10390622.69836943},
{'MarketName': 'USDT-ADA', 'High': 0.64899993, 'Low': 0.434, 'Volume': 30152195.40488637},
{'MarketName': 'BTC-VTC', 'High': 0.00037478, 'Low': 0.00031501, 'Volume': 800033.42837477},
{'MarketName': 'BTC-ADA', 'High': 5.645e-05, 'Low': 4.73e-05, 'Volume': 124383204.30281776}]


countsOfADA = 0
countsOfUSDTADA= 0

for n in data:
    a,b = n["MarketName"].split("-")

    if b == "ADA":
        countsOfADA += 1
        if a == "USDT":
            countsOfUSDTADA += 1

print( countsOfADA - countsOfUSDTADA )

Выход:

2

Если вы хотите посчитать еще немного, используйте Counter() :

from collections import Counter
myCounter = Counter()

for n in data:
    a,b = n["MarketName"].split("-")

    myCounter.update((a,))   # counts the first part
    myCounter.update((b,))   # counts the second part
    myCounter.update((a+"-"+b,))  # counts the complete thing

print(myCounter)  

Выход:

Counter({'ADA': 3, 'BTC': 2, 'ETH': 1, 'ETH-ADA': 1, 'USDT': 1, 'USDT-ADA': 1, 'VTC': 1, 'BTC-VTC': 1, 'BTC-ADA': 1})

Счетчик: https://docs.python.org/3/library/collections.html#collections.Counter

Счетчик работает только с хэшируемыми объектами и будет разлагать итерируемые объекты, поэтому, если вы хотите запихнуть в него строки, сначала поместите их в кортеж:

"abc" -> counted as 1 a , 1 b , 1 c
("abc",) -> counted as 1 "abc"-tuple which it will decompose into the string.
17.01.2018
  • Спасибо за ответ! Это решает проблему для одной монеты, но как протестировать каждую монету на паре ETH/USDT/BTC? Как заставить этот цикл также проверять, например, VTC? 18.01.2018
  • Я думаю, это все! Я заранее удаляю записи без ETH или BTC из списка, а затем подсчитываю количество записей с определенной монетой. Большое спасибо! 18.01.2018
  • @NoSplitSherlock взгляните на Counter() и его методы. 18.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..