Для эффективности сначала создаем set
из имен в b
, затем фильтруем список a
:
from operator import itemgetter
def returnOnlyOne(a, b):
b_names = set(map(itemgetter('name'), b))
only_in_a = list(filter(lambda item: item['name'] not in b_names, a))
return only_in_a
Пример вывода:
a = [
{'name': 'joseph', 'age': 33},
{'name': 'Emma', 'age': 11},
{'name': 'apple', 'age': 44}
]
b = [
{'name': 'apple', 'age': 44},
{'name': 'Emma', 'age': 22}
]
print(returnOnlyOne(a, b))
# [{'name': 'joseph', 'age': 33}]
Если вам не нравятся itemgetter
, filter
и т. П., Вы можете написать то же самое, используя понимание:
def returnOnlyOne(a, b):
b_names = set(item['name'] for item in b)
return [ item for item in a if item['name'] not in b_names]
Вы можете взглянуть на javabuilders ; он использует YAML для создания пользовательских интерфейсов Swing.
Простой пример из руководства [PDF]:
JFrame:
name: myFrame
title: My Frame
content:
- JLabel:
name: myLabel2
text: My First Label
- JLabel:
name: myLabel2
text: My Second Label
Альтернативно:
JFrame:
name: myFrame
title: My Frame
content:
- JLabel: {name: myLabel2, text: My First Label}
- JLabel: {name: myLabel2, text: My Second Label}
Или даже:
JFrame(name=myFrame,title=My Frame):
- JLabel(name=myLabel2, text=My First Label)
- JLabel(name=myLabel2, text=My Second Label)
Как правило, всегда полезно выполнять поиск, когда вы что-то ищете. Эта является первой ссылкой в Google при поиске «java xml gui»
Я могу найти следующие примеры того, что вы просите:
попробовать Свиби: http://swiby.codehaus.org/
" Swiby представляет собой смесь Swing и Ruby для действительно богатых распределенных приложений ». Другими словами, Swiby является языком смешения доменов и свингом.
Если вы хотите немного выйти за пределы простой Java, Groovy 'builder' Концепция работает очень хорошо с GUI. Конечно, вы можете легко взаимодействовать с Groovy и Java. См. Страницу Swing Builder для получения дополнительной информации.
I strongly recommend MiG Layout - it takes a few days to get used to the syntax, but once you've got it, it works wonders. I used JGoodies Forms for quite awhile, and Karsten's builder concept works well, but it is a bit cryptic... MiG is easier to pick up, and results in wonderfully concise code.
Хотя это не декларативное и ограничено исключительно макетами, вы можете взглянуть на DesignGridLayout , который позволяет программно определять макеты Swing в очень сжатой форме (с открытым исходным кодом).
Основные преимущества:
Если важна краткость, вы можете рассмотреть двойную скобку:
new JFrame("My Frame") {{
setName("myFrame");
add(new JLabel("My First Label") {{
setName("myLabel2");
}};
add(new JLabel("My Second Label") {{
setName("myLabel2");
}};
}}
Тогда вы не потеряете силы известного языка программирования общего назначения (вы знаете, что он вам понадобится, а JellyTags - отстой). Все, что вам нужно, - это одна небольшая дополнительная идиома.
Она используется не очень часто, потому что на самом деле люди, писающие с XML, не решают реальных проблем.
В общем, вы можете использовать слои построителя для абстрагирования повторяющегося кода. Код GUI не должен быть написан плохо, просто он почти весь (в том числе в учебниках).
Как автор CookSwing, инструмента, который делает то, что вам нужно, я внимательно изучил эту тему, прежде чем приступить к реальной реализации. Я зарабатывал себе на жизнь написанием приложений Java Swing GUI.
ИМО, если вы собираетесь использовать какие-либо императивные языки программирования для описания компонента Java Swing, вы можете просто использовать Java. Groovy и т. Д. Только добавляют сложности без особого упрощения.
Декларативные языки намного лучше, потому что даже непрограммисты могут понять это, особенно когда вам нужно делегировать задачу точной настройки конкретных макетов художникам. XML идеально подходит для декларативных языков (по сравнению с другими вариантами) из-за простоты, удобочитаемости и наличия множества доступных редакторов / инструментов преобразования и т. Д.
Вот проблемы, с которыми сталкиваются при декларативном программировании графического интерфейса: не в каком-то определенном порядке. Эти проблемы были устранены в CookSwing.
SDL/Swing делает именно то, что вам нужно. Это маленький (283k), ненавязчивый, простой в изучении декларативный фреймворк Swing.
menus {
"File" {
"Open" do="open" // calls "open()" in the controller
"---"
"Exit" do="exit"
}
}
SDL/Swing имеет открытый исходный код, но пользуется коммерческой поддержкой. Мы (Ikayzo.com) разрабатывали его в течение нескольких лет и внедрили его в производственные системы для многих клиентов - от компаний, занимающихся наукой о жизни, до банков.